在类中为自己的字段使用getter / setter有什么好处吗?

通常,在我自己的项目中,我使用getter和setter进行任何字段访问,然后我按照我的工作做同样的事情。 前段时间,我们项目的技术主管问我为什么这样做,为什么这比仅使用字段本身更好(如果需要通过子类访问,可以选择声明它们受保护)。 我无法想出一个明确的答案。

那么,是否有任何理由在类的自己的字段中使用getter和setter,或者直接使用字段是否更好?

最明显的答案是副作用:

int getCost() { if (cost == null) { calculateCost(); } return cost; } 

如果您需要费用,请使用getCost() 。 如果您想查看是否已计算cost ,请使用cost

如果围绕这些值存在任何业务逻辑(或者存在这种逻辑的可能性),则即使对于内部调用,使用getter和setter也是有益的。

例如,您的setter可能会对其输入进行validation,并抛出exception而不是存储无效值。 让所有代码使用该setter而不是简单地直接设置值意味着错误在发生时捕获,而不是在使用该值时很长时间。 getter的类似情况是当存在逻辑默认值时,应该在null的情况下使用。 通过使用getter,您可以安全地编写本地方法,而无需连续的空检查或默认选项。

也就是说,如果这些方法中没有业务逻辑,并且没有由它们引起的副作用,那么它主要是一种风格化的东西。 本质上,类内部的责任在于内部一致,只要它保持不变,那么无论是直接访问变量还是通过包装方法,它都是个人/专业偏好。

您希望将它们声明为公共getter和setter以及私有字段。 这意味着想要修改变量的外部类(不是子类)都是通过setter完成的,并通过getter获取它们。 这样做的好处是,如果您想控制它们获取或设置它们的条件或条件,或者想要添加信息甚至打印调试,则意味着您只需将它放在getter和setter中。

实际上有一个非常好的解释stackoverflow的好处:

在Java中,默认,公共,受保护和私有之间的区别

当然,只有在实际需要时才制作方法,同样地,只在外部类需要时才公开。

希望有助于防守!

这是关于为什么使用getter和setter的一般问题的一部分。 然而,许多开发人员在没有实践的情况下使用它们。 就我个人而言,如果需要的话,我只会放入吸气剂/安装者。

我建议你做最清楚/最简单的事。

一般来说,如果我以后可以轻松添加一个getter / setter,我就不需要添加它。 如果以后很难添加(或者您可以立即使用它们),我会将它们包括在内。

我们中的一些人是Web开发人员,所以我们采用创建JavaBeans并且JavaBeans有自己的规范 。 在说明书中,它明确指出:

  • 该类必须具有公共默认构造函数(无参数)。
  • 必须可以使用getsetis (用于布尔属性而不是get)和其他方法来访问类属性。
  • 该类应该是可序列化的。

原因是,JavaBeans是为可重用性而设计的,其中JavaBeans可以通过任何Java技术(例如Servlet,JSP,RMI,Web服务等)。

这是我的2cent值得我们为什么有吸气剂/安装者。 我主要创建JavaBeans。

有些人认为他们应该总是使用setter / getters来封装所有字段。 其他人则认为不应该使用这种做法。

如果您的类没有字段的任何逻辑并且仅用作持有者,则可以跳过使用方法并将字段声明为公共字段。 此概念也称为数据传输对象(或Messenger)。但作为规则,您应该使用此类字段的final属性来使您的类不可变:

 public class TwoTuple { public final A first; public final B second; public TwoTuple(A a, B b) { first = a; second = b; } } 

但是你必须强烈建议使用setter / getters:

  • 在Web应用程序中,有时需要使用setter / getter。 请参阅POJO / JavaBean对象。
  • 如果你的类将在并发环境中使用。 请参阅实践中的Java并发,第3.2节:“另一个线程是否实际上对已发布的引用执行某些操作并不重要,因为仍然存在滥用的风险。[7]一旦对象逃脱,您必须假设另一个类或者线程可能会恶意或不小心地滥用它。这是使用封装的一个令人信服的理由:它使得分析程序的正确性和更难以意外地违反设计约束变得切实可行“
  • 如果你想在设置/获取值时添加一些额外的逻辑,你必须使用setter / getters。 只需阅读封装及其优点。

我自己的意见总是将字段声明为“私有最终”,并且只有在需要时才更改这些属性。