java中setter的用法,Java接口使用指南 - 接口中的getter和setter是不是很糟糕?

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认同)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值