java - 在接口不好的情况下,Java接口使用指南—是getter和 setter?

  显示原文与译文双语对照的内容
0 0

人们认为界面中使用的最佳准则是什么? 什么应该和不应该进入一个接口?

我听说人们常说,作为一个通用的规则,接口只能定义行为而非状态。 这是否意味着接口不应该包含getter和 setter?

我的观点:也许对于setter来说不是这样的,但有时候我认为getter在接口中是有效的。 这仅仅是为了强制实现类实现这些 getter,从而表明客户端能够调用这些getter来检查某些东西,例如。

时间: 原作者:

0 0

我认为一般声明了两种类型的接口:

  1. 英镑服务描述 。 这可能是 CalculationService 。 我不认为方法 getX 应该在这类接口,当然 setX 。 它们很显然意味着实现细节,而这不是这种类型的接口的工作。
  2. 存在数据模型——只抽象出系统中数据对象的实现。 这些可以用来帮助测试或只是因为有些人老和我记得的日子( 例如) 使用持久性框架绑定你拥有一个特定 superclasss ( 例如 。 你将选择实现一个接口,以防你切换了持久层) 。 我认为在这种接口中拥有JavaBean方法是完全合理的。

注意:集合类可能适合于类型 #2

原作者:
0 0

我不知道接口为什么不能定义getter和 setter 。 例如 List.size() 实际上是一个 getter 。 接口必须定义行为而不是实现尽管——它不能说如何处理状态,但它可以坚持你可以设置它。

集合接口都是关于状态的,例如- 但是不同的集合可以完全不同的方式存储这种状态。

编辑:注释表明getter和setter表示一个简单字段用于存储存储。 i vehemently disagree不同意。 在我的脑海中,有一个暗示是,它是"合理廉价"获取/设置值,但不是以一个简单的实现来存储它。


编辑:就像注释中提到的,这在 JavaBeans规范第 7.1节中得到了明确的说明:

因此,即使脚本编写器类型在 b.Label = foo 中,仍然有一个方法调用到目标对象来设置属性,目标对象有完全的程序控制。

因此,属性不仅需要简单的数据字段,它们实际上可以是计算值。 更新可能有多种编程副作用。 例如更改bean颜色属性的背景也可能导致用新颜色重新绘制 bean 。"


如果假设蕴涵是真的,我们可以将属性作为字段直接暴露。 幸运的是,蕴含的并没有保持: getter和setter完全在他们的计算事物的权利之内。

例如考虑一个包含


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
}

或者( preferrably IMO ):


private Size size;

public int getWidth() {
 return size.getWidth();
}

public int getHeight() {
 return size.getHeight();
}

public Size getSize() {
 return size;
}

这里的大小属性或者高度/宽度属性只是为了方便- 但我看不到它们在任何方面都是无效的。

原作者:
0 0

我不认为bean应该在它上面有一个接口,一般来说。 javabean是更一般意义上的接口。 一个接口指定了更复杂的外部契约。 javabean契约的外部和它的内部表示是相同的。

虽然你不应该在接口中拥有 getter,但是。 完美的意义有一个ReadableDataThingie接口,由DataThingieBean实现。

原作者:
0 0

getter/setter本身并没有什么邪恶的东西。 然而:

  1. 对于它们所包含的字段,我倾向于将对象变成不可变的( 在第一个实例中) 。 为什么在构建阶段我实例化了大部分东西。 如果以后我想改变一些东西,我就放松那些限制。 所以我的接口倾向于包含 getter,而不是 setter ( 还有其他好处- 特别是线程) 。
  2. 我想让我的对象为我做,而不是相反。 所以当我的一个对象获得getter,我开始问这个对象是否应该有更多的功能,而不是将所有数据是别的东西。 有关详细信息,请参见这个答案

这些都是指南,注意。

原作者:
0 0

这涉及到整个 getter/setter的问题,这个主题在这个站点和其他地方被多次解决。

我倾向于不在接口中使用访问器,而是在实现中使用构造函数参数添加协作者。

原作者:
0 0

简单的实现是一个 getter,它不应该阻止它在接口中,如果它需要。

0 0

我听说人们常说,作为一个通用的规则,接口只能定义行为而非状态。 这是否意味着接口不应该包含getter和 setter?

对于初学者,至少使用Java和排除异常声明,你不能在没有状态的情况下定义完整的行为。 在Java中,接口不定义行为。 它们不能。定义的是类型;实现一组特征签名的承诺可能有一些post-conditions删除异常。 但是就是这样。行为和状态由实现这些接口的类定义。

其次,如果在接口中定义了getter和 setter,它们并不真正定义完整的行为( 另一个是用来读的,一个用来写一个属性。),你可以在setter和getter后面有复杂的行为,但是它们只能在实际的类中实现。 Java语言中没有什么可以让我们自由地定义接口中的行为,除了最严格的情况。

考虑到这个问题,在界面中的setter和getter有错误的语法和语义。

如果你的应用程序是well-modeled并且问题要求你有一个定义setter和getter的接口,为什么不。 例如查看ServletResponse界面。

现在,如果我们从实现符合javabean规范的类的角度来看getter和 setter,那么你不需要为它们定义接口。

但是如果你有东西需要setter和getter,像一个bean,并还需要插在 compile-type ( 不是在 run-time,就像一个 bean ), 可能存在多个实现,那么是的,这将要求一个接口定义getter和setter。

希望有帮助。

0 0

进一步阅读:一个Java框架架构师( Jaroslav Tulach,2008,Apress )的实用API设计忏悔。

原作者:
0 0

我使用了那些接口,比如我们有字段 beginDate,endDate 。 这些字段在许多类中,我有一个用例需要得到不同对象的日期,所以我提取接口并非常高兴:

原作者:
0 0

基本上如果对"要使用它的实例,我需要知道 [state, property, whateverThignAMaGit]的值"的回答是对的。 访问器属于接口。

上面的List.size() 是一个很好的例子,它需要在接口中定义

原作者:
...