2012-03-05 67 views
0

哪種方法更好?:PropertyModel或Serializable對象?

add(new Label("label", new PropertyModel<String>(cat, "name"))); 

add(new Label("label", cat.getName())); 

我試圖找到有關比較的任何信息..但我如何理解第一種方法是讀什麼也找不到 /寫邏輯和第二個只讀邏輯,(如果我不對,請寫信給我)。但只讀邏輯哪個更好?

回答

5

它們在功能上是不同的。

第一個說:只要這個組件被重新渲染,刷新值。第二個說:顯示創建時的值。

你需要哪一個?如果你想要一個動態刷新標籤,你沒有選擇,它是PropertyModelCompoundPropertyModel(見後面)。

如果您希望它保持不變,即使底層對象發生更改,也不能使用PropertyModel

  1. 它打破封裝:

    但是,如果你是絕對相信cat.getName()是永遠不會改變的,因此兩個版本行爲相同的方式,我個人不會,原因有三用PropertyModel:在沒有獲取者的情況下,它將嘗試訪問私人領域本身。

  2. 正如@Jesse指出的那樣,這是「魔術」。如果你重構你的課程並重命名你的領域,你的PropertyModel將會中斷。
  3. 閱讀或維護起來並不容易。當然,這並不難,但爲什麼當你沒有從中得到任何東西時增加任何不必要的複雜性?如果您將cat.getName()放在那裏,您可以在IDE中「點擊」,您的標籤將顯示在搜索所有getName()方法的調用中,等等。

如果你有許多組件是指同一對象的字段,您可以考慮使用CompoundPropertyModel s,這雖然仍存在的問題1和2受苦,使你的代碼看起來非常乾淨。

如果您有三個或更少的組件,但您不需要動態模型,只需使用無模型格式即可。

5

這個版本是你給了兩個選擇更好:

 
add(new Label("label", new PropertyModel(cat, "name"))); 

它允許在網頁上呈現的值,如果頁面被粉刷貓的名稱已更改後後更新。

第二個選項將只顯示貓的名稱,因爲它是在創建Label時。如果貓的名字改變,它永遠不會改變。

對於使用PropertyModel的危險有些話要說。這是「字符串」編程。您的編譯器不能幫助您驗證屬性名稱「name」的正確性。如果您稍後重構您的代碼並將該屬性的名稱更改爲「firstName」之類的名稱,那麼您將不得不手動查找引用舊屬性名稱的所有位置並手動更改它們。

+0

第二個變體必須是工作。構造此字符串:(創建模型 公共標籤(最後字符串的ID,字符串標籤) { \t這個(ID,新型號(標籤));} 它 – pushistic 2012-03-05 15:51:55

+1

僅包裝標籤爲模式;模型不能稍後更新此值,因爲它不知道任何關於貓對象的信息。 – rotsch 2012-03-05 17:40:43

相關問題