是否存在可变公共字段的用例?

m3t*_*man 5 java oop encapsulation

我想知道是否存在公共字段合理的用例(对于可变值)或者应该不惜一切代价避免使用,并且应该始终使用getter/setter.

假设有一个DTO(数据传输对象)/ Java Bean没有任何逻辑,只是保存数据(添加更多这可能是协议的一部分,不会改变,只会增强).实际上没有要封装的实现细节,因为没有实现,只有数据.还假设Bean Validation框架用于通过注释验证对象,因此没有用于验证逻辑的setter的目的.

为什么安装者和吸气者会困扰我?

没有setter/getter,它更容易阅读; 字段,尤其是内部类(您不必滚动到setter和getter来到达其他字段).而且,与Groovy user.password相比user.getPassword(),它更清晰.

我知道项目龙目岛; 但是我已经从Bean验证中获得了很多注释.

所以要明确这个问题:上述场景是否可以用于公共领域,或者更好的是有更多的setter/getter?为什么?

Old*_*eon 1

目前的观点是你不应该有可变的公共字段。

它源自两个不同方向的最小惊讶原则。

首先,常见的做法是将所有字段设为私有,只能通过 getter 和 setter 进行访问。有很多代码可以做到这一点,当您遇到不这样做的代码时,您会感到惊讶。

其次,它为您提供了可预测性。您可以保证除了您的设置器中之外,没有人会更改其他任何地方的字段。因此,您可以在 setter 上设置一个断点,并且知道该字段的每次更改都会遇到断点。

然而,在某些纯数据情况下,就像您所描述的那样,很容易将这些字段公开,甚至更罕见,而不是最终的。

我的工具箱中有一个Pair具有公共字段的类:

public class Pair<P, Q> {

    // Exposing p & q directly for simplicity. They are final so this is safe.

    public final P p;
    public final Q q;

    public Pair(P p, Q q) {
        this.p = p;
        this.q = q;
    }
Run Code Online (Sandbox Code Playgroud)