java - Java bean 的 setter 允许返回这个吗?

标签 java design-patterns

我可以定义 setter 方法来返回 this 而不是 void 吗?

喜欢:

ClassA setItem1() {
      return this;
}

ClassA setItem2() {
      return this;
}

然后我可以使用 new ClassA().setItem1().setItem2()

最佳答案

关于 JavaBeans 规范存在很多误解。

它存在的主要原因是统一的 Java“组件”模型。这是一种使用反射以编程方式与 Java 对象交互的方法。 API 本身被命名为 JavaBeans Introspection .请看一下示例用法,您会比普通 Java 程序员了解更多。

Introspection API 可用于以统一的方式操作 GUI 元素。您的组件将其属性公开为一对 getter 和 setter,以便可以在运行时在 GUI 构建器的属性表上发现和操作它们。

因此,在我看来,混合使用 Fluent API 和 JavaBeans Spec 是行不通的。这是两个完全不相关的概念,可以相互干扰。当方法签名不同(返回类型)时,JavaBeans Introspection 可能无法工作。

看看这个例子(取自链接教程):

public class SimpleBean
{
private final String name = "SimpleBean";
private int size;

public String getName()
{
    return this.name;
}

public int getSize()
{
    return this.size;
}

public void setSize( int size )
{
    this.size = size;
}

public static void main( String[] args )
        throws IntrospectionException
{
    BeanInfo info = Introspector.getBeanInfo( SimpleBean.class );
    for ( PropertyDescriptor pd : info.getPropertyDescriptors() )
        System.out.println( pd.getName() );
}
}

此示例创建一个非可视 bean 并显示从 BeanInfo 对象派生的以下属性:

  • 姓名
  • 尺寸

您可能想看看当您将 void 返回类型更改为任何其他类型时会发生什么。我这样做了,结果是一样的。那么,这是否意味着它是允许的?

恐怕不行。 JavaBeans 规范对这些方法签名非常严格。恰好实现是宽容的。尽管如此,我还是不建议将流畅的接口(interface)与 JavaBeans 混合使用。你不能真的相信这一点,如果这个发现现在有效,将来也会有效。

但是,从另一方面看——您似乎没有完全使用 JavaBeans。只有 getters/setters 对方法。如何实现和设计 API 取决于您。

关于java - Java bean 的 setter 允许返回这个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5741369/

相关文章:

design-patterns - 动态对象创建模式 - 我喜欢

java - 试图运行 GUI 应用程序,但 GUI 从未出现

c++ - 针对具有 gtest 程序的以下情况进行设计

java - 通过键绑定(bind)到 ObservableMap 的值

java - "URI is not hierarchical"+ 私钥

flutter - 将 mapEventToState 与传入流一起使用的最佳实践?

java - Decorator方法,Java中的一种Decorator类型

QTreeView 或 QTreeWidget

java - 是否可以检查所有 Java 8 流元素是否满足给定谓词之一?

Java 字节数组