2014-11-02 41 views
9

關於@ConstructorProperties不明白@ConstructorProperties

Documentation說:「在一個構造函數,說明該構造方法的參數如何對應構造對象的獲取方法的註釋」。它給出了一個不明確的例子,因爲變量名與參數相同。

我真的不明白爲什麼@ConstructorProperties({"x", "y"})指的是獲得者getX()getY()。 x和y的情況與註釋不一致。

所以要澄清應該是什麼在此代碼構造的註釋:

public class Point { 
    public Point(int a, int b) { 
     this.c = a; 
     this.d = b; 
    } 

    public int getCc() { 
     return c; 
    } 

    public int getDd() { 
     return d; 
    } 

    private final int c, d; 

}

(我編輯的代碼,因爲從答案,我理解的註釋預計代碼跟隨但我保持目的,消除歧義,吸氣劑名稱和實際變量返回之間的差異)

第二個問題...

@ConstructorProperties(value="text") 

這個註釋對於JButton(String text)有什麼意義?

它似乎提供給工具使用,但只是想了解。

回答

8

@ConstructorProperties依賴於通用命名約定來將構造函數參數與getter和setter方法進行匹配。 Getter和setter方法名稱通常是通過將該屬性的名稱大寫並預先設置獲得集合(或用於布爾型獲取器)。儘管如此,使用單個字母的示例並不是最好的。

例子:someValue成爲getSomeValue

請記住,方法參數的名字是不能在運行時可見。這是參數的順序。構造函數中使用的屬性和變量名稱無關緊要。以下內容仍將涉及名爲getSomeValue()的方法。

@ConstructorProperties({"someValue"}) 
public Point(int a) { 
    this.c = a; 
} 

此註釋的用例似乎是不可變對象的(反)序列化。該框架使用對象獲取器獲取所有值,然後序列化對象。當對象需要反序列化時,框架必須創建一個新實例。因爲該對象是不可變的,所以它沒有任何setter。構造函數是設置這些值的唯一方法,並且註釋用於告訴框架如何從序列化值構建序列化對象。

+0

謝謝你的詳細解答,kepep。在你的例子中,註解似乎告訴了兩件事:1 /這種類型的對象可以返回構造函數中使用的參數的原始值。 2 /該參數的值使用名爲'getSomeValue()'的方法檢索。這個值是否被內部存儲爲是或不是無關緊要的,重要的是它可以被檢索(通過對內部變量的簡單拷貝或通過一些計算)。那是對的嗎? – mins 2014-11-03 06:33:04

+0

是的,我認爲這是正確的。這個註釋的文檔非常短,所以我猜可能在java bean規範或使用註釋的框架文檔中有更多的信息。 – Kapep 2014-11-03 11:56:34