2010-06-22 113 views
8

我有以下兩類:拷貝構造函數的孩子,但沒有家長

public class User { 
    public Integer userId; 
    // ...another 50-60 fields 
} 

public class SuperUser extends User { 
} 

我想有超級用戶構造這需要用戶類型的對象,並創建類型爲超級用戶的對象。例如:

public SuperUser(User theUser) { 
    // not legal -> but I am looking for a one-liner to initialize this with values from theUser 
    this = theUser; 
} 

如果用戶對象缺少構造用戶(用戶existingUser),是否有任何自動的方式來初始化與所有來自現有用戶對象的字段的超級用戶對象?我試圖避免50行:

public SuperUser(User theUser) { 
    this.firstName = theUser.getFirstName(); 
    this.lastName = theUser.getLastName(); 
    // and so on.... 
} 

如果不能這樣做,是否有像「創建複製構造函數?」的重構。

謝謝!

回答

9

看看commons-beanutilsBeanUtils.copyProperties(..)

SuperUser superUser = new SuperUser(); 
BeanUtils.copyProperties(superUser, originalUser); 

或者,你可以在拷貝構造將是:

public SuperUser(User originalUser) { 
    BeanUtils.copyProperties(this, originalUser); 
} 
1

反思& BeanUtils的是方便,但速度緩慢。可能值得在你的情況下權衡,但我會避免它們。此外,Object.clone()不會給你你想要的..因爲用戶的克隆()方法(如果實施..它可能不會)..會給你一個用戶..不是超級用戶。

clone()很少使用。複製構造函數或工廠方法都是合理的模式。

編輯:忘了回答這個問題。是的,手動實現複製構造函數。 Java ==很多打字。

+1

我不認爲你所回答的問題;) – Bozho 2010-06-22 17:13:10

+0

但是,如果我沒有記錯,在Java中沒有真正的專用拷貝構造函數,那麼如何使用它們? – AndrejaKo 2010-06-22 17:17:48

+0

您可以手動實施它們。 – royal 2010-06-22 23:29:49

0

java.beans包可以處理這些東西:

User u = ...; 
SuperUser su = ...; 
BeanInfo bi = Introspector.getBeanInfo(User.class); 
for (PropertyDescriptor pd : bi.getPropertyDescriptors()) { 
    Method getter = bi.getReadMethod(), setter = bi.getWriteMethod(); 
    if (getter == null || setter == null) continue; 
    setter.invoke(su, getter.invoke(u)); 
} 
0

// ...another 50-60 fields.
代替String firstName等,用戶應該有領域,如Name name,其中有第一個,最後,標題等

你可以這樣做同樣的地址,聯繫方式等。這會使複製構造函數更容易。

順便說一句,因爲超級用戶擴展用戶,你的構造將

public SuperUser(User user){ 
    super(user); //the User constructor would do the copy 
    //initialize other fields... 
} 
+0

,假設我有一個構造函數: public User(User existing) 我沒有這樣的構造函數...... – David 2010-06-23 12:54:26

+0

實際上,它假設你可以創建一個受保護的超級構造函數('protected User(User現有的)')。 – Stephen 2010-06-23 21:44:40

4

雖然你可以使用類似的BeanUtils做你正在嘗試做的,如果你需要,以促進用戶到超級用戶或降級超級用戶給用戶,你是否使用了正確的抽象。

您可以重構您的代碼,以便用戶具有權限或特權?一般來說,當我覺得需要將對象更改爲層次結構中的其他對象時,我會重新排列層次結構。

例如:

public class User { 
    public Integer userId; 
    // ...another 50-60 fields 
    public Role role; 
} 

public interface Role { 
} 
public SuperUserRole implements Role { 
} 

如果你不想讓這種變化,然後Bozho的答案會工作。

0

如果你想在Android上使用BeanUtils,但沒有運氣,請嘗試使用android-java-air-bridge。 https://code.google.com/p/android-java-air-bridge/

只需下載android-java-air-bridge.jar.zip,解壓縮.jar並導入到您的項目中,無需更改任何代碼。

例子:

import javadz.beanutils.BeanUtils; 

BeanUtils.copyProperties(superUser, originalUser);