人们如何看待在界面中使用的最佳指南?应该将什么放入界面,不应该放入界面?
我听说过一般规则是,一个接口必须仅定义行为而不是状态。这是否意味着一个接口不应该包含getter和setter?
我的观点:也许对于setter不是这样,但有时我认为getter是有效的放置在接口中。这仅仅是为了强制实现类实现那些getter,并表示客户端可以调用那些getter来检查某些东西。
List.size()
实际上是一个getter。接口必须定义行为而不是实现 - 它不能说你会如何处理状态,但它可以坚持你可以获取它并设置它。编辑:如评论中所述,这在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
}
private Size size;
public int getWidth() {
return size.getWidth();
}
public int getHeight() {
return size.getHeight();
}
public Size getSize() {
return size;
}
这里的size属性或者height/width属性仅仅是为了方便而存在,但我并不认为这使它们无效。
我认为一般有两种类型的接口:
CalculationService
。我认为不应该在这种类型的接口中包含 getX
这样的方法,当然更不应该包含 setX
。它们明显暗示了实现细节,而这并不是这种类型接口的职责。注意:集合类可能适合于第二种类型。
有关getter/setter方法并没有本质上的邪恶,但是:
这些只是指南,注意。
一般情况下,我认为一个bean不应该有一个接口。从更一般的意义上说,javabean本身就是一个接口。接口指定了更复杂实体的外部契约,而javabean的外部契约和内部表示是相同的。
然而,我不认为接口中不能有getter方法。对于一个可读取数据的东西,例如ReadableDataThingie接口,它被DataThingieBean实现是完全合理的。
这涉及到整个Getter/Setters是邪恶的话题,这个话题在本网站和其他地方都得到了多次解决。
我倾向于不在接口中使用访问器,而是使用构造函数参数来添加协作者到实现中。
如果某个东西的直接实现方式是作为getter,那并不意味着它不能在接口中使用。
我曾经使用过这种接口,例如我们有带有beginDate和endDate字段的类。这些字段在许多类中都存在,而我需要为不同的对象获取这些日期,因此我提取了接口并感到非常高兴 :)
更多阅读:实用API设计Java框架架构师的自白(Jaroslav Tulach,2008年,Apress出版社)。
基本上,如果回答“我需要知道[state、property、whateverThignAMaGit]的值才能使用它的实例吗?”是肯定的...那么访问器应该属于接口。
John上面提到的List.size()是需要在接口中定义的完美示例。