我可以定义 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/