2011-09-27 57 views
9

Play! framework generates getters and setters針對模型類的每個公共字段在運行時受益於Play中產生的獲取者和設置者!框架

public class Product { 

    public String name; 
    public Integer price; 
} 

將被轉化爲

public class Product { 

    public String name; 
    public Integer price; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getPrice() { 
     return price; 
    } 

    public void setPrice(Integer price) { 
     this.price = price; 
    } 
} 

手動進一步解釋:

然後,當您要訪問的屬性,你可以這樣寫:

product.name = "My product"; 
product.price = 58; 

這是翻譯在加載時間到:

product.setName("My product"); 
product.setPrice(58); 

...並警告說:

不能直接使用getter和setter方法來訪問屬性 如果依靠自動生成。這些方法在 運行時生成。所以如果你在你編寫的代碼中引用它們,編譯器 將不會找到這些方法,並會產生一個錯誤。

因爲我不能在Play以外使用這些獲取器和設置器!項目,我看不出有什麼好處。與所有現代IDE的重構(重新封裝一個字段並更改調用者)相比,公共字段有哪些優勢?

回答

8

簡答:豆類需要它們。

更長:豆規格要求(除其他外)每個內部領域的getter/setter。我不是100%確定的,但我認爲Hibernate和Groovy模板都期望Java Beans(POJO Bean,而不是Java EE),因此他們會要求獲取getters/setter。這樣做可以節省時間,所以你不必擔心鍋爐代碼(除非你想定義你自己的getter/setter,出於某種原因,你可以這樣做)。

+0

+1好答案。我已經擴大了關於定義自己的制定者和獲取者的觀點,因爲我認爲這是一個非常重要的觀點。 – Codemwnci

8

另一個原因是,雖然你不必指定setter和getters,但你仍然可以!

所以,如果你有(按你的例子​​)

product.name = "my product" 

這很好,並且使你的代碼更快,在我看來,更容易閱讀。然而,封裝的設置者和獲取者有很好的理由。如果您想在product.name更改時添加一些邏輯,則可以指定自己的setter,但不必更改上面的代碼,因爲它將繼續在幕後調用setter。

因此,這可以爲您提供良好封裝的靈活性和強大功能,但是可以實現直接字段訪問的整潔和可讀性。

我認爲這是兩全其美的。

+0

但是由於「屬性」僅在同一個Play中可用!項目,我可以輕鬆地使用我的IDE重構。 – deamon

+0

是的,但是這樣你就失去了可讀性。如果這真的有幫助,我發現,在模板中。 – Codemwnci

0

如果您有一個私有的getter/setter方法,那麼這將不起作用,因爲無法創建具有相同名稱的公共getter/setter方法。所以它會在運行時失敗!