Jon Skeet..
24
我不明白为什么界面不能定义getter和setter.例如,List.size()实际上是一个吸气剂.接口必须定义行为而不是实现 - 它不能说你将如何处理状态,但它可以坚持你可以得到它并设置它.
例如,集合接口都是关于状态的 - 但是不同的集合可以以完全不同的方式存储该状态.
编辑:评论表明,getter和setter意味着一个简单的字段用于支持存储.我强烈反对这种含义.在我看来,有一个含义是获取/设置值"相当便宜",但并不是说它存储为具有简单实现的字段.
编辑:正如评论中所述,这在JavaBeans规范第7.1节中已明确说明:
因此,即使脚本编写器输入某些内容,例如b.Label = foo
仍然有一个方法调用到目标对象来设置属性,并且目标对象具有完全的编程控制.
因此,属性不仅仅是简单的数据字段,它们实际上可以是计算值.更新可能有各种程序性副作用.例如,更改bean的背景颜色属性也可能导致使用新颜色重新绘制bean."
如果假定的含义是正确的,我们也可以直接将属性作为字段公开.幸运的是,这种含义并不成立:获取者和制定者完全有权计算事物.
例如,考虑一个组件
getWidth()
getHeight()
getSize()
你是否相信存在三个变量?要么有以下方面是不合理的:
private int width;
private int height;
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public Size getSize() {
return new Size(width, height); // Assuming an immutable Size type
}
或者(最好是IMO):
private Size size;
public int getWidth() {
return size.getWidth();
}
public int getHeight() {
return size.getHeight();
}
public Size getSize() {
return size;
}
这里size属性或高度/宽度属性只是为了方便 - 但我没有看到这使它们以任何方式无效.
我不同意这个含义.如果想要,吸气者完全有权计算价值. (15认同)
鉴于Java API充满了各种各样的东西,并且有充分的理由,我会说它正在做出这样的假设.我会说**暗示**是因为你正在调用一个方法而不是直接访问一个字段,你*不应该*假设它什么都不做.如果我真的想要传达只有一个要访问的字段,我将公开一个字段. (4认同)
"持久状态的一部分"!="该类型的字段".持久状态可以保存在地图中,也可以作为某种较大类型的一部分(如我所示的宽度/高度/大小示例). (3认同)
(否则你可能只是公开字段并完成它...使它成为一种方法的全部意义是*隐藏*实现.) (2认同)
如果你假设getWhatever()只返回字段'what'的值,那么有一天(很快)某事会证明你错了 (2认同)