通常,在我自己的项目中,我使用getter和setter进行任何字段访问,然后我按照我的工作做同样的事情。前段时间,我们项目的技术负责人问我为什么这样做,为什么这比仅仅使用字段本身更好(如果需要通过子类访问,可以选择声明它们受保护)。我无法得出一个明确的答案。
那么,是否有任何理由在类的自己的字段中使用getter和setter,或者直接使用字段是否更好?
答案 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。在说明书中,它明确指出:
原因是,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:
我自己的意见总是将字段声明为“私人决赛”,只有在需要时才会更改这些属性。