繁体   English   中英

Java:每个成员的生成是否可能等同于Lombok或Intellij IDEA?

[英]Java: Generate Per Member Equals Possibly With Lombok or Intellij IDEA?

是否有任何有助于以下主题的生成器:

在一个Java类中,我具有一个member属性:

private String attribute1;

我想要一个生成器或类似的东西,可以帮助我编写以下代码行:

public boolean equalsAttribute1(MyClass myClass) {
    return myClass.getAttribute1().equals(this.attribute1);
}

龙目岛是否提供这种可能性? 还是有Intellij IDEA插件?

最接近的是实时模板。 对于实时模板,将模板定义为:

public boolean equals$NAME$($CLASS$ myClass) {
    return myClass.get$NAME$().equals(this.$CamelCaseName$);
}

变量定义为:

NAME=capitalize(clipboard())
CLASS=className()
CamelCaseName=camelCase(NAME)

将此内容绑定到诸如“ eq”后跟制表符的位置。

现在,将属性名称复制到剪贴板,将光标移动到所需的方法,然后键入“ eq”,然后键入tab。 它应该扩展以提供您想要的东西。

您可以定义一个宏来为您完成全部工作。

请注意,您的代码混合了getter和field并抛出了NPE。

您是否真的需要一堆方法,还是需要一个更通用的方法?

我强烈希望后者,因为一堆方法很有用,您将需要一堆调用程序,并且代码膨胀会激增。

为此,您可以使用反射或注释处理。 反射具有一些运行时开销(不像以前那样糟糕),但是它可以访问私有成员(除非安全管理器禁止)。

像下面这样的事情

public static ImmutableSet<String> differingFields(Object o1, Object o2) throws IllegalAccessException {
    checkNotNull(o1);
    checkNotNull(o2);
    checkArgument(o1.getClass() != o2.getClass());
    ImmutableSet.Builder<String> result = ImmutableSet.builder();
    for (Field f : o1.getClass().getDeclaredFields()) {
        f.setAccessible(true);
        if (!Objects.equals(f.get(o1), f.get(o2))) {
            result.add(f.getName());
        }
    }
    return result.build();
}

它使用番石榴,因为我更喜欢不变的结果,但这不是必需的。 低效率来自自动装箱和反射访问,这很可能是可以接受的。

它仅在传入完全相同的类的实例时才起作用。它将忽略继承的字段。 这很容易修复。

您不仅可以返回字段名称,还可以返回Guava的MapDifference等。 无需实现differingFields ,您可以将对象转换为地图并对其进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM