![](/img/trans.png)
[英]Is it a good practice to use set methods in the constructor to initialize class's fields?
[英]Is it good practice to initialize fields inside a JPA entity getter?
在POJO Java bean中,這樣的代碼可能是有益的,尤其是對於集合:
class POJO {
private Collection<X> col;
public Collection<X> getCol() {
if (col == null)
col = new SomeCollection<X>();
return col;
}
}
它使得使用POJO
的代碼可以調用pojo.getCol().isEmpty()
而無需額外的空檢查,從而使代碼更清晰。
假設POJO
類是JPA實體,它仍然可以安全嗎? 通過將集合從null初始化為空的集合,持久性數據將不會被更改,但是,我們仍在修改對象,因此持久性提供程序可能會在刷新持久性上下文時產生一些副作用。 我們有什么風險? 便攜性可能嗎?
我認為這不是一種好的做法,更像是一些很少需要的優化。 如果SomeCollection的創建非常繁重,也許懶惰的初始化是有意義的。 相反,你可以在聲明時初始化它(代碼更清潔至少對我來說):
class POJO {
private Collection<X> col = new SomeCollection<X>();
public Collection<X> getCol() {
return col;
}
}
在刷新或可移植性問題中沒有副作用,並且您有一個空檢查更少。
我強烈反對ORM實體中屬性的延遲初始化。
當使用Hibernate進行實體屬性的延遲初始化時,我們遇到了一個嚴重的問題,所以我強烈反對它。 我們看到的問題表現在我們發出搜索請求時發生的保存。 這是因為當加載對象時屬性為null,但是當調用getter時它將返回延遲初始化對象,因此hibernate(正確地)將對象視為臟對象並在發出搜索之前將其保存。
一般來說,最好使用空集合或null(對於集合的字段)。
但我不推薦你在吸氣器中的方式。
在我個人看來,上面的“規則”也應該用於對象的內部表示。 所以你做得更好:
class POJO {
private Collection<X> col = new SomeCollection<X>();
無論如何,如果你想要更多的保存,你需要保護你更新col
引用的每一種方式。 但在JPA應用程序中,這應該是一個非常原始的用例。
延遲初始化非常常見且很好。
在構造函數或變量定義中進行權衡與初始化:
臨
精讀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.