人们如何看待界面中使用的最佳指南?什么应该和不应该进入界面?

我听人们说,作为一般规则,接口必须只定义行为而不是状态。这是否意味着一个接口 不应该包含 getter 和 setter 吗?

我的想法:也许对于 setter 来说并非如此,但有时我认为 getter 可以有效地放置在接口中。例如,这只是为了强制实现类来实现这些 getter,从而表明客户端能够调用这些 getter 来检查某些内容。

有帮助吗?

解决方案

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

  1. A 服务说明. 。这可能是这样的 CalculationService. 。我不认为方法 getX 应该在这种界面中,并且 当然 不是 setX. 。它们非常清楚地暗示了实现细节,这不是此类接口的工作。
  2. A 数据模型 - 存在的唯一目的是抽象出系统中数据对象的实现。这些可能用于帮助测试,或者只是因为像我一样老的人还记得(例如)使用持久性框架将您束缚于拥有特定超类的日子(即,如果您切换持久层,您会选择实现一个接口)。我认为在这种类型的接口中拥有 JavaBean 方法是完全合理的。

笔记:集合类可能适合类型 #2

其他提示

我不明白为什么接口不能定义 getter 和 setter。例如, List.size() 实际上是一个吸气剂。接口必须定义行为而不是 执行 不过——它不能告诉你你会怎样 处理 状态,但它可以坚持要求您可以获取并设置它。

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

编辑:注释表明 getter 和 setter 意味着使用一个简单的字段来进行后备存储。我强烈不同意这种暗示。在我看来,这意味着获取/设置该值“相当便宜”,但并不是说它存储为具有简单实现的字段。


编辑:正如评论中所指出的,这一点在 JavaBeans 规范 第 7.1 节:

因此,即使脚本作者在诸如 b.Label = foo目标对象仍有一个方法调用以设置属性,并且目标对象具有完整的程序化控制。

因此,属性不仅是简单的数据字段,还可以实际计算值。更新可能具有各种程序化副作用。例如,更改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
}

或者(最好是国际海事组织):

private Size size;

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

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

public Size getSize() {
    return size;
}

这里的大小属性或高度/宽度属性只是为了方便 - 但我不认为这会使它们以任何方式无效。

getter/setter 本身并没有什么邪恶之处。然而:

  1. 我倾向于使我的对象相对于它们包含的字段而言是不可变的(首先)。为什么 ?我在构建阶段实例化了大多数事情。如果我以后想改变一些事情,我就会放宽这些限制。所以我的接口倾向于包含 getter,但不包含 setter(还有其他好处 - 特别是线程)。
  2. 我希望我的对象为我做事, ,而不是相反。因此,当我的一个对象获取多个 getter 时,我开始询问该对象是否应该具有更多功能,而不是将其所有数据暴露给其他对象使用。看 这个答案 了解更多详情。

请注意,这些都是指导方针。

我不认为一个bean应该在它上面的接口,一般。一个JavaBean是在更普遍的意义的接口。接口指定的一些更复杂的外部合同。一个JavaBean的外部合同及其内部表示是相同的。

我不会说,你不应该在一个接口干将,虽然。它非常有意义到具有由DataThingieBean实现的ReadableDataThingie接口。

  

我听到人们说,作为一个   一般情况下,一个接口只需   定义行为,而不是状态。是否   这意味着,一个接口不应该   包含getter和setter?

对于初学者来说,至少在Java和排除异常声明,你不能定义不完整状态的行为。在Java中,接口没有规定的行为。他们不能。他们定义什么是类型;一些条件后WRT例外可能实施一系列功能签名的承诺。但仅此而已。行为和状态通过执行这些接口的类定义。

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

。通过考虑这一点,有不妥 - 语法和语义。 - 与具有接口setter和getter

如果您的应用程序以及建模和问题要求你必须定义getter和setter方法的接口,何乐而不为。例如,看看在ServletResponse的接口。

现在,如果我们看一下从视图实现类遵循JavaBeans规范的点getter和setter方法,那么你就不需要为它们定义接口。

但是,如果你有事情需要getter和setter方法,像豆可能,而这也需要在编译型被插入(而不是在运行时如豆可能),以及其多种实现可能存在,然后是的,这将要求限定getter和setter的接口。

希望它能帮助。

此触及整个吸气/ setters是其在本网站和其他地方处理多次恶主题。

我倾向于不具有接口存取器,但要加使用构造函数的参数来执行合作者。

的事实,即直接的实现的东西是作为吸气剂不应该停止在它的接口是如果它需要。

有关进一步阅读:一个Java框架架构师实用API设计自白(雅罗Tulach,2008,Apress出版)

我使用的那些种接口,例如,我们有与类字段BEGINDATE,结束日期。这些领域在许多类和我有一个使用情况下,我需要得到不同对象的日期,所以我提取界面和非常高兴:)

基本上,如果答案为“我需要知道的[状态,性能,whateverThignAMaGit]为了与它的一个实例工作的价值?”然后是...的访问者属于在接口

从以上约翰则为list.size()是需要在接口中定义的吸气剂的一个最好的例子

吸气剂用于查询对象的状态 - 这是你设计接口时,你才能真正避免。阅读 http://www.pragprog.com/articles/tell-dont-ask

scroll top