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

Java Lombok项目是否与使用getter和setter的数据封装相矛盾?,java,validation,lombok,Java,Validation,Lombok,声明一个私有变量并通过公共getter/setter方法(Java中的封装原则)访问它,可以用来在setter方法中添加自定义验证 例如:如果我在Bank类中的setBalance()setter方法中放入负数验证,我可以限制银行中的负金额存款。这意味着可以限制字段中的意外更改。所以,如果我使用lombok,显然我不需要定义getter/setter方法。我可以做些什么来合并上述验证。 它不会限制利用Java的数据封装特性吗 它并没有破坏数据封装,它使它更加方便:简单的getter和setter

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

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

它不会限制利用Java的数据封装特性吗

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

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

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


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

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

<>我建议你考虑数据结构和可以在它们上面执行的动作(比如验证)作为单独的关注点。通过这种方式,您将能够分别修改数据和验证。 要实现这一点,您可以使用一些框架,如或

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


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

Yes在getter上使用注释。你是对的。因此,您应该根据上下文仔细使用它

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


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

验证与封装无关。但从引用的wiki链接中,它说:在面向对象编程中,封装是将数据与操作该数据的方法捆绑在一起,或者限制对对象某些组件的直接访问。“。但是使用@Setter,可以直接访问对象中的所有字段……@KenChan Lombok生成getter和Setter,前提是您被告知这样做。我说的是你需要揭露的事情。。。如果不需要公开内容,可以使用
AccessLevel.NONE
覆盖行为。我已经更新了answer.cool,所以在使用@Setter时应该是这样的,lombok only不会为字段生成Setter,除非您要求这样做,因为默认情况下,它会根据您的需要为所有字段生成Setter。如果需要公开任何内容,您可以避免使用
@Data
,并且仅对需要公开的唯一字段使用
@Getter
。如果需要,您只能使用lombok生成相等比较。您不需要取消类的所有字段的默认设置。谢谢你的评论!在出现使用getter和setter的“工具”之前,需要getter和setter有一个非常具体的原因。这是对某一领域的变化做出“反应”的唯一方式。无论如何,java正在努力解决这个问题,并用“datum”类删除冗长的内容,至少这是我上次查看功能提案时的名称。@Eugene我不确定您的响应是什么,但还好。