java - 是否有可变公共(public)字段的用例?

标签 java oop encapsulation

<分区>

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

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

为什么 setter 和 getter 会打扰我?

没有 setter/getter 更容易阅读;字段,尤其是对于内部类(您不必滚动到 setter 和 getter 即可到达其他字段)。此外,使用 user.password 而不是 Groovy 中的 user.getPassword() 更清晰。

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

因此,为了明确问题:上述场景是否适用于公共(public)领域,还是拥有 setter/getter 更好? 为什么?

最佳答案

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

它源自 Principle of least astonishment从两个不同的方向。

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

其次,它为您提供了可预测性。您可以保证没有人会在您的 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/

相关文章:

c++ - 如何最好地封装窗口句柄?

encapsulation - Swift 中的数据封装

java - ArrayDeque 到数组

java - TestNG @Factory注解+对依赖注入(inject)的了解不够

c++ - 将 STL 分配器与 STL vector 一起使用

javascript - (开源)JavaScript 原型(prototype) OO 示例

共同 friend 类的 C# 解决方法

java:符号查找错误: undefined symbol :fftw_malloc

java - Tomcat 6 的 JDBC 池

oop - 关于面向对象编程的抽象数据类型 vs 数据类型 vs 数据结构