为什么使用 Getters 和 Setter
考虑一个基本类,其中包含 Java 中带有 getter 和 setter 的对象:
public class CountHolder {
private int count = 0;
public int getCount() { return count; }
public void setCount(int c) { count = c; }
}
我们无法访问 count
变量,因为它是私有的。但我们可以访问 getCount()
和 setCount(int)
方法,因为它们是公开的。对某些人来说,这可能会引发一个问题; 为什么介绍中间人?为什么不简单地让他们公开?
public class CountHolder {
public int count = 0;
}
出于所有意图和目的,这两者在功能方面完全相同。它们之间的区别在于可扩展性。考虑每个类所说的内容:
- 首先 :“我有一个方法可以给你一个
int
值,一个方法可以将该值设置为另一个int
”。 - 第二 :“我有一个你可以随意设置并获得的节奏。”
这些可能听起来很相似,但第一个实际上更加谨慎; 它只是让你与它的内部性质互动,它使然。这将球留在球场上; 它可以选择内部交互如何发生。第二个是在外部暴露其内部实现,现在不仅容易受外部用户的影响,而且在 API 的情况下,致力于维护该实现(或以其他方式发布非向后兼容的 API)。
让我们考虑是否要同步访问修改和访问计数。首先,这很简单:
public class CountHolder {
private int count = 0;
public synchronized int getCount() { return count; }
public synchronized void setCount(int c) { count = c; }
}
但是在第二个例子中,如果不经过并修改引用 count
变量的每个地方,现在几乎是不可能的。更糟糕的是,如果这是你在库中提供以供其他人使用的项目,则你没有办法执行该修改,并且被迫做出上述的艰难选择。
所以它引出了一个问题; 公共变量是一件好事(或者至少不是邪恶的)?
我不确定。一方面,你可以看到经得起时间考验的公共变量示例(IE:System.out
中引用的 out
变量)。另一方面,提供一个公共变量除了极小的开销和潜在的冗长度之外没有任何好处。我的指导原则是,如果你计划公开变量,你应该根据这些标准判断它有极端的偏见:
- 变量应该没有可能的原因,以曾经在其实施改变。这是非常容易搞砸的事情(即使你确实做到了,需求也会改变),这就是为什么 getter / setter 是常见的方法。如果你要使用公共变量,则需要仔细考虑,尤其是在库/框架/ API 中发布时。
- 变量需要经常引用,以减少冗长所带来的最小收益需要它。我甚至不认为使用方法与直接引用的开销应该在这里考虑。对于我保守估计为 99.9%的应用程序而言,这几乎可以忽略不计。
可能还有比我没有考虑过的更多。如果你有任何疑问,请始终使用 getter / setter。