2011-05-04 19 views
3

我在Spring框架中編寫了一些java代碼。Java - 如何簡化我的java

我有兩個豆,人和person1。它們的結構略有不同,也就是說每個變量的名稱略有不同。

我試圖從一個bean複製到另一個的細節。如果值不爲null,我只想複製該值。我見過一個名爲BeanUtils的API,但無論它是否爲null,都會複製它。

這裏是我的代碼:

if (person != null) { 
     if (person.getAddressDetails() != null) { 
       if (person.getAddressDetails().getStreetNumber() != null) { 
         person1.getAddressDetails().setStreetNo(person.getAddressDetails().getStreetNumber()); 
       } 

       if (person.getAddressDetails().getStreetName() != null) { 
         person1.getAddressDetails().setStreetName(person.getAddressDetails().getStreetName()); 
       } 
     } 

     if (person.getHomeDetails() != null) { 
       if (person.getHomeDetails().getPhoneNumber() != null) { 
         person1.getHomeDetails().setSPhoneNo(person.getHomeDetails().getPhoneNumber()); 
       } 
     } 
} 

我有大約40個節點需要被複制,這將創造這麼多醜陋的代碼。有沒有人有更好的方法來做到這一點?也許如果我做了一個映射或什麼,然後通過它循環?不確定。

如果沒有,有沒有人知道我是否可以讓BeanUtils運行副本而不復制空值?

原因是第二個bean person1已經有一堆值。我只想覆蓋,如果有新值覆蓋它。

像往常一樣,變量是一個更大的系統的一部分,我不能標準化名稱。

感謝

+0

如果所有值都由標準getter/setter方法定義,則可以使用反射來查找字段,並且只在字段不爲空時執行復制。不過,你可能會爲了try/catch塊和反射代碼而關閉if/else塊。 – BobG 2011-05-04 02:15:06

+0

我不熟悉反射,你能解釋一下嗎? – Jason 2011-05-04 02:42:24

+0

你沒有明確地說出來,但我是否正確地假設person和person1是同一類的實例? – 2011-05-04 03:02:44

回答

5

進場從另一個方向的問題,你的源數據對象不應該關心約束或目標對象的業務邏輯要求。

這將是緊耦合,這是不好的,特別是如果你使用Spring,你正在做的IoC容器例如Spring它想幫你做什麼。

null checking編碼在你的目標對象的setXXX()方法,即辦理業務規則,如果你再也不想當源屬性null設置目標屬性的正確位置。

public setXXX(final String s) 
{ 
    if (s == null) { // do nothing } 
    else { this.xxx = s; } 
} 

然後你可以使用任何你想要的映射策略/庫而不用擔心源數據null狀態。盲目設置屬性並讓目標決定何時忽略傳入的null

+0

a)如果有一個覆蓋非空屬性的一般業務規則,這對於一個複雜的系統可能很難概括;和b)將特定的邏輯添加到ORM持久化的對象,如果嘗試merge(),最終會讓你的生活變得糟糕。 – BobG 2011-05-04 03:06:09

+0

他們沒有說任何關於ORM或任何這些問題。我堅持我的回答,類應該決定它的'不可行'和'外部實體',即**緊密耦合**並且破壞封裝引入**低內聚性**並且使得調試成爲一場噩夢。 OOA的最佳實踐是**鬆散耦合**和**高內聚**具有可怕的類名,如'person'和'person1'我不認爲OP真的關心理論*企業*的擔憂,他們只是想使用最少量的代碼將屬性數據從一個類映射到另一個類。 – 2011-05-04 03:14:01

+0

+1是面向對象的方法。 – stivlo 2011-05-04 03:21:32