Java 接口(interface)使用指南——接口(interface)中的 getter 和 setter 是否不好?

标签 java interface javabeans setter getter

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

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

我的意见:对于 setter 来说可能不是这样,但有时我认为 getter 可以有效地放置在接口(interface)中。这只是为了强制实现类来实现这些 getter,从而表明客户端能够调用这些 getter 来检查某些东西。

最佳答案

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

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

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


编辑:正如评论中所述,这在 JavaBeans specification 中已明确说明。第 7.1 节:

Thus even when a script writer types in something such as b.Label = foo there is still a method call into the target object to set the property, and the target object has full programmatic control.

So properties need not just be simple data fields, they can actually be computed values. Updates may have various programmatic side effects. For example, changing a bean’s background color property might also cause the bean to be repainted with the new color."


如果假设的含义为真,我们也可以直接将属性公开为字段。幸运的是,这种暗示成立: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;
}

这里的 size 属性或 height/width 属性只是为了方便起见 - 但我不认为这会使它们以任何方式无效。

关于Java 接口(interface)使用指南——接口(interface)中的 getter 和 setter 是否不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1130294/

相关文章:

java - 同时从两个目录提供 jetty webapp

java - 可选 nillable 值的 JAX-WS 处理

java - 接口(interface) : profit of using

java - Spring 是否允许替换引用 bean 中的属性?

java - Spring 3.1实例化bean报错

java - 如何在java中将字符串从3维数组拆分为新的2维数组

c# - 与具有相同名称和不同返回类型的成员接口(interface)

c# - 从 winforms 基类显式调用接口(interface)方法

java - session 范围 bean - 如何处理多用户数据

java - 使用实例工厂方法动态创建原型(prototype)bean