2

是否有任何生成器可以帮助解决以下主题:

在 java 类中,我有一个成员属性:

private String attribute1;

我想要一个生成器或类似的东西,这有助于我拥有这些代码行:

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

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

4

2 回答 2

0

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

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

变量定义为:

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

将此绑定到诸如“eq”之类的内容,然后是制表符。

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

您可能可以定义一个宏来为您完成所有工作。

于 2017-12-17T00:07:54.540 回答
0

请注意,您的代码混合了 getter 和字段并引发 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();
}

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

它仅在传入完全相同类的实例时才有效。它忽略继承的字段。这很容易解决。

MapDifference您可以返回 Guava或类似名称,而不仅仅是字段名称。differingFields您可以将对象转换为地图并对其进行处理,而不是实现。

于 2017-12-17T16:56:30.933 回答