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

时间:2010-11-30 10:42:45

标签: java

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

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

6 个答案:

答案 0 :(得分:6)

最明显的答案是副作用:

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

    return cost;
}

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

In Java, difference between default, public, protected, and private

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

希望有助于防守!

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

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

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

public class TwoTuple<A,B> {
  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 Concurrency,第3.2节: “另一个线程是否真的对已发布的引用做了什么并不重要,因为滥用的风险仍然存在。[7]一旦对象逃脱,你必须假设另一个类或线程可能,恶意或不小心滥用这是使用封装的一个令人信服的理由:它使实际分析程序的正确性和更难以意外地违反设计约束“
  • 如果要在设置/获取值时添加一些额外的逻辑,则必须使用setter / getters。只需阅读封装及其优点。

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

相关问题