2015-05-16 96 views
0

我有一個包含字符串字段和Map的POJO類。 我讀了關於克隆對象的Joshua Bloch Effective Java片段,但我認爲這種情況並非如此微不足道。 我有幾個POJO,我想用複製構造函數的方法克隆它們,但我不知道如何克隆映射,因爲值有一個對象?如何正確克隆對象類?

我知道這個對象可能是一個簡單的不可變對象,例如一個String類,但有時它可能是一個完全不同的POJO,甚至列表或映射。我認爲它可能工作的onyl方式是使用instanceof在構造函數中進行一些檢查,但它很醜陋(我必須檢查List,Map和每個POJO是否正確?)。

也許我應該改變我的方法來實現Cloneable接口?

我也看到了一個序列化的克隆方法,但我認爲這也是一個醜陋的解決方案,並且它的性能會比使用Copy構造器方法時糟糕。

你能給我一個建議,我應該如何克隆我的POJO?

+3

爲什麼要克隆他們呢?特別是如果你甚至不知道它們是什麼類型。因爲你甚至不知道它們的類型,所以你無法修改它們。 –

+0

18年來我從未在生產代碼中使用過clone()。 – EJP

+0

爲什麼?因爲我有一個POJO「A」,其中包含具有不同屬性的POJO列表「B」,並且我想要完全不同的對象,一個新副本。我只需要它,因爲我想創建pojo「A」的幾個實例。那些POJO「A」應該在POJO「B」中具有不同的值,並且如果POJO「A」將參照相同的「B」POJO,那麼我將不能在不同的POJO「A」中設置不同的值。 –

回答

0

您可以檢查Apache CommonsBeanUtils。它有cloneBean(Object bean)這個方法可以克隆所有的屬性,即使這個類沒有實現Cloneable接口。

+0

那麼,你假設對象是JavaBeans? – RealSkeptic

+0

這個假設是正確的,因爲它們是JavaBean,但是我已經嘗試過了,並且它沒有工作,因爲JavaBeans是Main JavaBeans的屬性沒有被克隆。假設我有稱爲「主」的JB,其中第二個JB叫做「屬性」。我幾次克隆了JB「Main」,並且他們引用了與最初的「Main」JavaBean相同的「Property」JB。 –

+0

來自文檔: 注意:此方法創建一個淺層克隆。換句話說,Bean引用的任何對象都是與克隆共享的,而不是依次被克隆。 –