为了账号安全,请及时绑定邮箱和手机立即绑定

Lombok 项目是否与使用 getter 和 setter 的数据封装相矛盾?

Lombok 项目是否与使用 getter 和 setter 的数据封装相矛盾?

素胚勾勒不出你 2023-11-10 16:43:39
声明私有变量并通过公共 getter/setter 方法(Java 中的封装原理)访问它,可以在 setter 方法中添加自定义验证。例如:如果我setBalance()在 Class 的 setter 方法中放置负数验证Bank,我可以限制Bank. 这意味着可以限制字段中的意外更改。所以如果我使用 lombok,显然我不需要定义 getter/setter 方法。我可以做什么来合并上述验证。这不会限制Java的数据封装特性的利用吗?
查看完整描述

3 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

通过使用@Getter@Setter,@Data@Value Lombok会自动生成您字段的公共访问器,如果您不需要公开AccessLevel.NONE可以在@Getter,上使用的字段@Setter。使用 lombok 可以尊重
封装。

我建议您将数据结构和可以对其执行的操作(例如验证)视为单独的关注点。通过这种方式,您将能够分别修改数据和验证。为了实现这一点,您可以使用一些框架,如spring或aspectj。

如果您觉得这种方法对您的应用程序来说太过分了,您可以求助于不可变数据结构 ( @Value) 以及用于创建实例的私有构造函数和静态方法。这些方法将执行必要的验证。

在类上添加验证的另一种方法是使用hibernate 验证在 getter 上使用注释。


查看完整回答
反对 回复 2023-11-10
?
holdtom

TA贡献1805条经验 获得超10个赞

是的。你是对的。所以你应该根据上下文谨慎使用它。

如果一个对象是一个富域对象,那么简单地@Setter为其所有字段添加公共设置器可能是一个坏主意,因为客户端可以轻松地将任何字段设置为任何值,而无需调用封装所有应完成的业务逻辑的正确方法。 。所以最终,对象的状态可能是不正确的。

但如果对象只是作为一个数据容器,没有任何业务逻辑(例如DTO),使用@Setter/@Getter可以节省你一些时间,并使代码噪音更少。


查看完整回答
反对 回复 2023-11-10
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

它不会破坏数据封装,而是使其更加方便:简单的 getter 和 setter 只是噪音。

如果您的代码需要除简单的获取或设置之外的其他内容,那么显然自动生成它们是没有意义的——但这是一个正交问题:您也无法手动完成。

您将受限访问与业务逻辑混为一谈。

无论如何:您也许能够使用 AOP 系统在自动生成的函数周围放置保护子句,但您需要强制执行处理器运行的顺序。在我看来,这会造成混乱并产生额外的认知开销:业务逻辑要么是显式的,要么是分层在显式代码之上的。


查看完整回答
反对 回复 2023-11-10
  • 3 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信