2010-06-22 48 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);