Java 接口使用指南 -- 接口中的 getter 和 setter 是坏的吗?

2022-09-01 02:05:41

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

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

我的观点:对于设置者来说可能不是这样,但有时我认为getters被放置在一个界面中是有效的。这仅仅是为了强制实现类来实现这些 getter,从而指示客户端能够调用这些 getter 来检查某些内容,例如。


答案 1

我不明白为什么接口不能定义 getter 和 setter。例如,实际上是一个获取者。接口必须定义行为而不是实现 - 它不能说你将如何处理状态,但它可以坚持你可以获取它并设置它。List.size()

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

编辑:评论表明,getters和setters意味着一个简单的字段用于支持存储。我强烈反对这种暗示。在我看来,有一种暗示是,获取/设置值是“相当便宜的”,但并不是说它被存储为具有简单实现的字段。


编辑:如注释中所述,这在 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属性或高度/宽度属性只是为了方便 - 但我不认为这会使它们以任何方式无效。


答案 2

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

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

注意:集合类可能适合键入 #2