Java Bean 的 setter permit 是否返回此函数?
我可以定义 setter 方法来返回这个而不是 void 吗?
喜欢:
ClassA setItem1() {
return this;
}
ClassA setItem2() {
return this;
}
那么我可以使用新的ClassA().setItem1().setItem2()
我可以定义 setter 方法来返回这个而不是 void 吗?
喜欢:
ClassA setItem1() {
return this;
}
ClassA setItem2() {
return this;
}
那么我可以使用新的ClassA().setItem1().setItem2()
关于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 取决于您。
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。