如何制作数据 lombok return 深拷贝 getter 方法
How to make Data lombok return deep copys of getter method
Spotbugs 发出以下错误警告:
[ERROR] Medium:MetaData.getCreatedAt() 可能会通过 returning MetaData.createdAt [...MetaData] At MetaData.java:[line 21] 公开内部表示EI_EXPOSE_REP
为了解决这个问题,我想我必须return“createdAt”的深层副本。
有直接用@Data解决这个问题的方法吗?
没有,有none。原因是每个 class 创建防御副本是不同的,最好的方法取决于您的用例。 Lombok 无法知道您想要什么或需要什么。
例如,考虑一个带有可修改列表的可变 class 作为字段,即列表内容可能会与 getList()
调用同时更改。在某些情况下,return 和 Collections.unmodifiableList()
将反映可能同时发生的列表更改可能是合理的。在其他情况下,return 一个永不改变的列表可能会更好,例如通过 List.copyOf()
创建列表的真实副本。
此外,如果列表中的对象也是可变的,您可能也想 clone/copy 那些对象。
所以如果你想return一个防御副本,你必须手动实现getter。
Spotbugs 发出以下错误警告:
[ERROR] Medium:MetaData.getCreatedAt() 可能会通过 returning MetaData.createdAt [...MetaData] At MetaData.java:[line 21] 公开内部表示EI_EXPOSE_REP
为了解决这个问题,我想我必须return“createdAt”的深层副本。
有直接用@Data解决这个问题的方法吗?
没有,有none。原因是每个 class 创建防御副本是不同的,最好的方法取决于您的用例。 Lombok 无法知道您想要什么或需要什么。
例如,考虑一个带有可修改列表的可变 class 作为字段,即列表内容可能会与 getList()
调用同时更改。在某些情况下,return 和 Collections.unmodifiableList()
将反映可能同时发生的列表更改可能是合理的。在其他情况下,return 一个永不改变的列表可能会更好,例如通过 List.copyOf()
创建列表的真实副本。
此外,如果列表中的对象也是可变的,您可能也想 clone/copy 那些对象。
所以如果你想return一个防御副本,你必须手动实现getter。