我有几个不同的POJO使用一个生成器模式,但添加的助洗剂为每一个和生成后Object.toString
,Object.hashCode
和Object.equals
,我的类最终会被大约100行代码。必须有更好的方法来处理此问题。我认为拥有某种反思性的建设者会有所帮助,但是我不确定这将是一个好习惯,我也不确定如何实现它。换句话说,有没有办法实现这样的构建器?
一个简单的POJO:
public class Foo {
public int id;
public String title;
public boolean change;
...
}
然后是某种反射性生成器:
Foo = ReflectiveBuilder.from(Foo.class).id(1).title("title").change(false).build();
简短的回答不。您要求的是不可能的。反射在运行时查看代码并动态调用方法,它无法生成实际方法。
您可以做的是:
Foo foo = ReflectiveBuilder.from(Foo.class).
set("id", 1).
set("title", "title").
build();
这有三个大问题:
String
s-错字会导致运行时错误,而不是编译时错误,Object
s-错误的类型会导致运行时错误,而不是编译时错误,并且因此,基于反射的解决方案虽然可行(请参阅Apache Commons BeanUtils BeanMap
),但实际上是不可行的。
长话大说,如果您愿意允许一些编译时的魔术,可以使用Project Lombok。Lombok的想法是使用Java注释预处理器系统从注释生成样板代码。
真正神奇的是,所有的IDE,以及至少大3,明白注释预处理和代码完成将还会正常运行即使代码并不真正存在。
在POJO
带有a的情况下,Builder
您可以使用@Data
和@Builder
@Data
@Builder
public class Foo {
public int id;
public String title;
public boolean change;
...
}
该@Data
注释将产生:
final
字段),equals
和hashCode
使用所有字段的方法(可以使用@EqualsAndHashCode
注释进行配置)toString
所有字段上的方法(可以使用@ToString
注释和public
所有字段的getter和setter(可以使用字段上的@Getter
/@Setter
注释进行配置)。该@Builder
注释会产生所谓的一个内部类Builder
可以使用被实例化Foo.builder()
。
一定要确保你配置equals
,hashCode
并且toString
方法,如果你有两个班,龙目岛有相互之间的引用,那么你最终会在默认情况下,一个无限循环既是类包括其他的这些方法。
还有一个新的配置系统,例如,您可以使用流利的设置器,因此如果POJO可变,则可以减少构建器的使用:
new Foo().setId(3).setTitle("title)...
对于另一种方法,您可以查看面向方面的编程(AOP)和AspectJ。AOP允许您将类分成“方面”,然后使用预编译器使用某些规则将它们组合在一起。例如,您可以使用自定义批注和方面来完全实现Lombok的功能。但是,这是一个相当高级的主题,可能会适得其反。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句