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

声明私有变量并通过公共 getter/setter 方法(Java 中的封装原理)访问它,可以在 setter 方法中添加自定义验证。

例如:如果我setBalance()在 Class 的 setter 方法中放置负数验证Bank,我可以限制Bank. 这意味着可以限制字段中的意外更改。所以如果我使用 lombok,显然我不需要定义 getter/setter 方法。我可以做什么来合并上述验证。
这不会限制Java的数据封装特性的利用吗?


素胚勾勒不出你
浏览 167回答 3
3回答

慕斯王

通过使用@Getter, @Setter,@Data或@Value Lombok会自动生成您字段的公共访问器,如果您不需要公开AccessLevel.NONE可以在@Getter,上使用的字段@Setter。使用 lombok 可以尊重封装。我建议您将数据结构和可以对其执行的操作(例如验证)视为单独的关注点。通过这种方式,您将能够分别修改数据和验证。为了实现这一点,您可以使用一些框架,如spring或aspectj。如果您觉得这种方法对您的应用程序来说太过分了,您可以求助于不可变数据结构 ( @Value) 以及用于创建实例的私有构造函数和静态方法。这些方法将执行必要的验证。在类上添加验证的另一种方法是使用hibernate 验证在 getter 上使用注释。

holdtom

是的。你是对的。所以你应该根据上下文谨慎使用它。如果一个对象是一个富域对象,那么简单地@Setter为其所有字段添加公共设置器可能是一个坏主意,因为客户端可以轻松地将任何字段设置为任何值,而无需调用封装所有应完成的业务逻辑的正确方法。 。所以最终,对象的状态可能是不正确的。但如果对象只是作为一个数据容器,没有任何业务逻辑(例如DTO),使用@Setter/@Getter可以节省你一些时间,并使代码噪音更少。

喵喵时光机

它不会破坏数据封装,而是使其更加方便:简单的 getter 和 setter 只是噪音。如果您的代码需要除简单的获取或设置之外的其他内容,那么显然自动生成它们是没有意义的——但这是一个正交问题:您也无法手动完成。您将受限访问与业务逻辑混为一谈。无论如何:您也许能够使用 AOP 系统在自动生成的函数周围放置保护子句,但您需要强制执行处理器运行的顺序。在我看来,这会造成混乱并产生额外的认知开销:业务逻辑要么是显式的,要么是分层在显式代码之上的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java