当前位置: 首页 > 知识库问答 >
问题:

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

伯洋
2023-03-14

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

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


共有3个答案

叶桐
2023-03-14

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

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

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

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

杨骏
2023-03-14

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

如果您的代码需要的不是简单的get或set,那么自动生成它们显然没有意义——但这是一个正交问题:您也无法手动执行。

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

在任何情况下:您都可以使用AOP系统在自动生成的函数周围放置保护子句,但您需要强制执行处理器运行的顺序。在我看来,这会造成混乱和额外的认知开销:让业务逻辑保持明确,或者在明确的代码之上分层。

范俊逸
2023-03-14
匿名用户

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

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

但是,如果该对象只是用作没有任何业务逻辑(例如DTO)的数据容器,那么使用Setter//code>/Getter可以节省一些时间,并使代码具有更少的噪声。

 类似资料:
  • 据我所知,封装对外部人员隐藏了您的数据成员,并且只允许它使用相同类的方法访问。因此他们无法向外部人员显示您的个人数据。遵循这是真的, 在这里,您的金额变量不会与使用private的外部用户共享,他们也不知道您使用的变量名称。 但在类似的情况下,我们还提供了访问它们的getter/setter,那么封装如何能够从外部安全地进行呢? 这意味着getter或setter方法很可能具有相同的模式,而局外人

  • 问题内容: 这是一个纯Python特定的设计问题: 和 Python让我们可以用任何一种方式来做。如果要设计Python程序,将使用哪种方法,为什么? 问题答案: 首选属性。这就是他们在那里的目的。 原因是所有属性在Python中都是公共的。以一两个下划线开头的名称只是警告,给定属性是实现细节,在将来的代码版本中可能会保持不变。它不会阻止您实际获取或设置该属性。因此,标准属性访问是访问属性的常规P

  • 问题内容: 我读过一些书,说为诸如和的变量创建setter和getter很好。例如: 但这有什么区别? 和 如果二传手和消气手更好,您能给我解释一下实际问题吗? 问题答案: 多个原因: 如果您允许像 shape.x = 90 那么您将来将无法添加任何逻辑来验证数据。 如果x不能小于100,就不能这样做,但是如果您有像 您不能在写入逻辑上添加诸如复制之类的内容(请参见CopyOnWriteArray

  • 我正在用月蚀和龙目岛。getter和setter是正确生成的,但它们在类体中是不可见的(我知道这就是全部的要点)。然而,正因为如此,我无法从类内部执行对getter或setter用法的搜索。因此,如果我想检查what和where实际上设置了一个字段的特定值,我必须对getter名称执行字符串搜索,这会很慢,并且可能会给出不好的结果(例如,对于另一个类中同名的字段)。 在Eclipse中,是否有一种

  • 问题内容: 我喜欢Lombok项目,但如今,我正在阅读并尝试Java 14的一些新功能。 在新功能内部,有record关键字,该关键字允许创建具有以下内置功能的类:构造函数,私有最终字段,访问器,equals / hashCode,getter和toString方法。 现在我的问题是:最好依靠Lombok的功能,还是我们应该开始使用记录功能: 最好使用这个: 或者那个: 两种方法的优缺点是什么?

  • 我在为Lombok getter和setter生成Javadoc时遇到问题。这两个建议我都试过了。示例字段及其文本如下所示: 但是,我在生成的Javadoc中既没有看到getter,也没有看到setter。我在Eclipse上使用受保护的可见性(项目-