Closed. This question is opinion-based。它当前不接受答案。
想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
已关闭6年。
Improve this question
我想知道是否存在用例公开字段合理(用于可变值)的情况,或者不惜一切代价避免使用这种情况,并且应该始终使用 setter/getter /设定剂。
假设有一个DTO(数据传输对象)/Java Bean,它不具有任何逻辑,仅保存数据(要添加更多,这可能是不变的协议(protocol)的一部分,只能增强)。
实际上,没有实现细节需要封装,因为没有实现,只有数据。
另外,假设Bean验证框架用于通过注释验证对象,因此不存在使用setter来验证逻辑的目的。
为什么安装者和吸气者会打扰我?
没有设置者/获取者,更容易阅读;字段,特别是对于内部类(您无需滚动到setter和getter即可到达其他字段)。另外,与Groovy中的相比,拥有
我知道 Lombok 项目;但是我已经有很多来自Bean Validation的注释。
因此,要弄清楚这个问题:上述方案是否可以为公共(public)领域辩护,还是让设置者/获取者更好? 为什么?
想要改善这个问题吗?更新问题,以便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