2011-05-09 41 views
5

寫JavaBean類的正確規則是什麼?JavaBean類規則

我很困惑,因爲有些書的使用必須,而其他用戶應該或可能來形容 則寫規則:

  • 一個bean類必須實現Serializable或應注意什麼?
  • 實例變量必須是私有的或應該是?

回答

7

一個JavaBean是由它的性質(即其getter和setter方法)來定義,而不是它的領域。儘管這些術語可以互換使用,但實際上並不正確。 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; 
    } 
} 

你會覺得屬性是:

  • 「巴茲」(int
  • 「 phleem「(char[]

但現在讓我們用JavaBeans的內省檢查它:

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 

結論:

getter和setter方法是什麼定義一個JavaBean屬性。這是一個約定,它們由相同名稱和類型的字段支持,但這些字段實際上並不是Javabean屬性的一部分(儘管許多文檔會另有建議)。


關於重讀我的答案:它是作爲其他答案的附錄。如果你想得到一個簡短而簡單的答案,那就和skaffman一起去吧。

+0

很抱歉,但我不明白的好。如果沒有一個變量名和一個get/set方法名之間的強制性匹配一個構建工具如何可以獲取或設置給予即它的名稱變量? – xdevel2000 2011-05-09 10:17:35

+1

@ xdevel2000:因爲這個「不匹配」是由javaBean規範定義的,所以作爲命名約定。 – skaffman 2011-05-09 10:30:35

+0

正如我所說:這是一個慣例,僅此而已。在99%的情況,你應該使用這種約定,和工具將幫助你*僅*如果你使用這種約定。但我只想讓你知道底層字段*不是* bean屬性,而getter和setter方法是。 – 2011-05-09 10:31:40

1

添加到以前的海報 - skaffman。覆蓋它總是一個好習慣,toString(),hashCode(),equals()最後編寫一個包含所有字段(該類都有)作爲輸入的重載構造函數。

一定不要使用其他引用(如列表,包含HashMap等)在toString()hashCode()的實現。

在一個側面說明,Eclipse已經內置功能來生成它們..

1
  • 這是一個公開課。

  • 它有一個公共的無參數的構造函數(儘管它可能有其他的構造 以及)

  • 它實現Serializable接口(即它可以是持久的,所以它的狀態可以 保存)

  • 它與「吸氣」,並按照 JavaBeans的命名模式

  • 它有一個遵循標準的JAV事件命名爲「二傳手」的方法屬性註冊方法 按照JavaBeans命名模式命名的事件模型

  • 它可能有其他方法不遵循命名模式。這些 方法不會被構建器工具公開。

0

以上所有內容都不應該跨越Java API的界限。這意味着它不應該擴展或實現任何類或接口,但一弛是有它只能執行一個序列化interfce爲什麼,因爲它是一個標記接口