是否有任何生成器可以帮助您完成以下主题:
在java类中,我有一个成员属性:
private String attribute1;
我想要一个生成器或类似的东西,这有助于我拥有这些代码行:
public boolean equalsAttribute1(MyClass myClass) {
return myClass.getAttribute1().equals(this.attribute1);
}
龙目岛是否提供这种可能性?或者它有一个Intellij IDEA插件吗?
答案 0 :(得分:0)
你最接近的是一个实时模板。对于实时模板,将模板定义为:
public boolean equals$NAME$($CLASS$ myClass) {
return myClass.get$NAME$().equals(this.$CamelCaseName$);
}
变量定义为:
NAME=capitalize(clipboard())
CLASS=className()
CamelCaseName=camelCase(NAME)
将此绑定到诸如“eq”之后的选项卡。
现在将属性名称复制到剪贴板,将光标移动到您想要方法的位置,然后键入“eq”,然后键入选项卡。它应该扩展为你想要的东西。
您可以定义一个宏来为您完成所有操作。
答案 1 :(得分:0)
请注意,您的代码会混合使用getter和字段并抛出NPE。
你真的需要一堆方法,还是一种更通用的方法呢?
我非常喜欢后者,因为一堆方法很有用,你需要一堆调用者,代码膨胀会增加。
为此,您可以使用反射或注释处理。 Reflection有一些运行时开销(没有以前那么糟糕),但它可以访问私有成员(除非安全管理员禁止)。
以下内容应该做
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
。