JavaBean类规则

时间:2011-05-09 09:53:10

标签: java javabeans

编写JavaBean类的正确规则是什么?

我很困惑,因为有些书必须使用,而其他用户应该或者可以描述 写作规则:

即。

  • bean类必须实现Serializable或SHOULD?
  • 实例变量必须是私有的还是应该是?

5 个答案:

答案 0 :(得分:7)

JavaBean由其属性(即其getter和setter方法)定义,而不是 fields 。尽管这些术语可以互换使用,但实际上并不正确。 Introspector机制完全忽略了字段。

示例

拿这个(设计得很好)Javabean:

public class TestBean {
    private int baz;
    private char[] phleem;

    public String getFoo() {
        return new String(phleem);
    }
    public void setFoo(final String foo) {
        this.phleem = foo.toCharArray();
    }
    public long getBar() {
        return baz;
    }
    public void setBar(final long bar) {
        this.baz = (int) bar;
    }
}

您认为属性是:

  • “baz”(int
  • “phleem”(char[]

但现在让我们用Javabeans introspector检查它:

for (PropertyDescriptor descriptor : Introspector
        .getBeanInfo(TestBean.class, Object.class)
        .getPropertyDescriptors()) {
    System.out.println("Name: " + descriptor.getName() + 
                     ", type: " + descriptor.getPropertyType());
}

这是输出:

Name: bar, type: long
Name: foo, type: class java.lang.String

结论:

Getters和setter定义了Javabeans属性。它是一个约定,它们由具有相同名称和类型的字段支持,但这些字段实际上并不是Javabean属性的一部分(尽管许多文档会另有说明)。


重新阅读我的答案:这是对其他答案的补充。如果你想要一个简短的答案,请选择skaffman's。

答案 1 :(得分:2)

  • 这是一个公共课。

  • 它有一个公共无参数构造函数(尽管它可能有其他构造函数 ()

  • 它实现了Serializable接口(即它可以是持久的,因此它的状态可以 被保存)

  • 它具有以下命名的“getter”和“setter”方法的属性 JavaBeans命名模式

  • 它具有遵循标准Java事件模型并具有注册的事件 遵循JavaBeans命名模式命名的方法

  • 可能有其他方法不遵循命名模式。这些 方法不会被构建器工具公开。

答案 2 :(得分:1)

添加到上一张海报 - skaffman。覆盖toString()hashCode()equals()并最终编写一个包含所有字段(此类具有的)作为输入的重载构造函数始终是一种好习惯。

请确保不要在toString()hashCode()的实现中使用其他引用(例如List,HashMaps等)。

另一方面,eclipse具有为您生成它们的内置功能..

答案 3 :(得分:1)

Java Bean是一个Java类,应遵循以下约定:

  • 它应该有一个无参数的构造函数。
  • 应该为Serializable
  • 它应该提供用于设置和获取属性值的方法,称为gettersetter方法。

答案 4 :(得分:0)

以上所有内容都不应跨越Java API的界限。这意味着它不应该扩展或实现任何类或接口,但只有一种放松,它只能实现一个可序列化的interfce,因为它是一个标记接口