Java Bean 的 setter permit 是否返回此函数?

2022-09-02 23:15:10

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

喜欢:

ClassA setItem1() {
      return this;
}

ClassA setItem2() {
      return this;
}

那么我可以使用新的ClassA().setItem1().setItem2()


答案 1

关于JavaBeans规范有很多误解。

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

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

因此,在我看来,混合流畅的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规范对这些方法签名非常严格。只是碰巧实施是宽容的。尽管如此,我还是不建议将 Fluent interface 与 JavaBeans 混合使用。你不能真的相信这一点,如果现在发现有效,那么将来也会这样。

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


答案 2

JavaBeans 规范将 JavaBean 描述为:

Java Bean是一个可重用的软件组件,可以在构建器工具中直观地操作

它们需要在其他属性中提供内省、自定义、事件和持久性(第 2.1 节:什么是 Bean?

通常将“Java Bean”调用到普通的旧 Java 对象,其访问器方法遵循 JavaBeans 规范(第 7.1 节和第 8.3 节)。事实是,这样的对象可能仍然远远不符合所有要求。

如果您在此类中定义的对象实际上是 JavaBean,那么您的方法必须根据 JavaBean 规范第 7.1 节返回 void,其中访问器方法描述如下:

void setFoo(PropertyType value); // simple setter
PropertyType getFoo(); // simple getter

第8.3节命名为属性设计模式说:

默认情况下,我们使用设计模式通过查找以下形式的方法来查找属性:

public <PropertyType> get<PropertyName>();
public void set<PropertyName>(<PropertyType> a);

此外,对于布尔属性,我们允许 getter 方法匹配模式:

public boolean is<PropertyName>();

但是,如果你的类只是一个 POJO,那么使用你的方法链策略没有错,因为你被允许偏离规范,因为你实际上并没有构建 JavaBean。毕竟,并非所有您定义的类都应该是JavaBean,对吧?

您可能想看看Oracle JavaBeans Tutorial


推荐