踩坑日记(1)

328 阅读2分钟

踩坑日记(1)

lombok-builder

今天在项目中用到了lombok的@Builder注解,这个注解使对象的赋值更加紧凑,避免了大量的set语句。@Builder注解通过编译期的代码注入,在被注解的实体类内部生成了一个静态内部类,该内部类具有外部类的属性,在调用build()方法时,调用了外部类的全参构造函数,将内部类的属性赋值给外部类,实现了建造者模式。但是,这个注解也产生了一些问题。

默认构造函数覆盖

这个其实不算是builder注解的问题,上面说了Builder注解需要调用全参构造函数,所以默认的无参构造函数就会被覆盖,这时如果之前调用了无参构造函数的位置就会报错,如果需要在使用了builder注解的同时还要无参构造函数的话需要手动添加无参构造器,或者配合@NoArgsConstructor注解使用。

属性默认值覆盖

因为Builder注解生成的静态内部类不继承外部类属性的值,而后又通过全参构造器给外部类重新赋值,这时如果外部类属性有默认值的话就会被覆盖。解决方案就是在不希望被覆盖的默认值属性上加上@Builder.Default注解。

Data属性造成的EI_EXPOSE_REP问题

由于Data属性在传递的时候是引用传递,之后对Data属性的操作会改变原有对象中的Data,所以常规解决方案是通过重写get和set方法,在传递的时候不传递原对象,而是传递原日期对象的clone。但是在这里这种方法并不能解决findbugs里面的报错,看博客说这是findbugs的问题,只能通过添加@SuppressFBWarnings(value = {"EI_EXPOSE_REP", "EI_EXPOSE_REP2"})注解解决。