Closed. This question is opinion-based。它当前不接受答案。












想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

已关闭6年。



Improve this question




我想知道是否存在用例公开字段合理(用于可变值)的情况,或者不惜一切代价避免使用这种情况,并且应该始终使用 setter/getter /设定剂。

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

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

没有设置者/获取者,更容易阅读;字段,特别是对于内部类(您无需滚动到setter和getter即可到达其他字段)。另外,与Groovy中的相比,拥有user.password而不是user.getPassword()更加明显。

我知道 Lombok 项目;但是我已经有很多来自Bean Validation的注释。

因此,要弄清楚这个问题:上述方案是否可以为公共(public)领域辩护,还是让设置者/获取者更好? 为什么?

最佳答案

当前的意见是而不是具有可变的公共(public)字段。

它是从Principle of least astonishment的两个不同方向派生而来的。

首先,通常的做法是将所有字段都设为私有(private),仅通过getter和setter进行访问。那里有太多的代码可以做到这一点,当您遇到没有的代码时会感到惊讶。

其次,它使您具有可预测性。您可以保证,确保没有人会更改设置者以外的其他任何字段。因此,您可以在 setter 上设置一个断点,并且知道,对该字段的每次更改都将达到断点。

但是,像您这样的纯数据情况描述了将字段公开的诱人之处,甚至更罕见,而不是最终的。

我的工具箱中有一个Pair类,它具有公共(public)字段:

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;
    }

关于java - 有可变的公共(public)场所用例吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29937705/

10-12 22:37