样板太多,如何减少POJO生成器?

构建模式

我有几个不同的POJO使用一个生成器模式,但添加的助洗剂为每一个和生成后Object.toStringObject.hashCodeObject.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();
蜘蛛鲍里斯(Boris)

简短的回答您要求的是不可能的。反射在运行时查看代码并动态调用方法,它无法生成实际方法。

您可以做的是:

Foo foo = ReflectiveBuilder.from(Foo.class).
              set("id", 1).
              set("title", "title").
              build();

这有三个问题:

  1. 字段是Strings-错字会导致运行时错误,而不是编译时错误,
  2. 值是Objects-错误的类型会导致运行时错误,而不是编译时错误,并且
  3. 这比替代方案要慢得多,因为反射非常慢。

因此,基于反射的解决方案虽然可行(请参阅Apache Commons BeanUtils BeanMap),但实际上是不可行的。

长话大说,如果您愿意允许一些编译时的魔术,可以使用Project LombokLombok的想法是使用Java注释预处理器系统从注释生成样板代码。

真正神奇的是,所有的IDE,以及至少大3,明白注释预处理和代码完成将还会正常运行即使代码并不真正存在。

POJO带有a的情况下,Builder您可以使用@Data@Builder

@Data
@Builder
public class Foo {

    public int id;
    public String title;
    public boolean change;
    ...

}

@Data注释将产生:

  • 必需的参数构造函数(采用所有final字段),
  • equalshashCode使用所有字段的方法(可以使用@EqualsAndHashCode注释进行配置
  • toString所有字段上方法(可以使用@ToString注释和
  • public所有字段的getter和setter(可以使用字段上@Getter/@Setter注释进行配置)。

@Builder注释会产生所谓的一个内部类Builder可以使用被实例化Foo.builder()

一定要确保你配置equalshashCode并且toString方法,如果你有两个班,龙目岛有相互之间的引用,那么你最终会在默认情况下,一个无限循环既是类包括其他的这些方法。

还有一个新的配置系统,例如,您可以使用流利的设置器,因此如果POJO可变,则可以减少构建器的使用:

new Foo().setId(3).setTitle("title)...

对于另一种方法,您可以查看面向方面的编程(AOP)和AspectJAOP允许您将类分成“方面”,然后使用预编译器使用某些规则将它们组合在一起。例如,您可以使用自定义批注和方面来完全实现Lombok的功能。但是,这是一个相当高级的主题,可能会适得其反。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章