Java 复制子级而不是父级中的构造函数

Java 复制子级而不是父级中的构造函数,java,Java,我有以下两门课: public class User { public Integer userId; // ...another 50-60 fields } public class SuperUser extends User { } 我希望在SuperUser中有一个构造函数,它接受User类型的对象并创建SuperUser类型的对象。例如: public SuperUser(User theUser) { // not legal -> but I

我有以下两门课:

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

public class SuperUser extends User {
}
我希望在SuperUser中有一个构造函数,它接受User类型的对象并创建SuperUser类型的对象。例如:

public SuperUser(User theUser) {
    // not legal -> but I am looking for a one-liner to initialize this with values from theUser
    this = theUser;
}
public class User {
   public Integer userId;
   // ...another 50-60 fields
   public Role role;
}

public interface Role {
}
public SuperUserRole implements Role {
}
如果用户对象缺少构造函数用户(用户existingUser),是否有任何自动方法使用现有用户对象中的所有字段初始化超级用户对象?我试图避免50行:

public SuperUser(User theUser) {
    this.firstName = theUser.getFirstName();
    this.lastName = theUser.getLastName();
    // and so on....
}
如果无法做到这一点,是否存在类似“创建副本构造函数”这样的重构

谢谢

看一看:

或者,您可以将其放置在复制构造函数中:

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

反射和小海狸很方便,但速度很慢。在你的情况下,这可能是值得的,但我会避免它们。此外,Object.clone()不会提供您想要的。。因为用户的clone()方法(如果实现..可能不是。。将为您提供一个用户。。不是超级用户

clone()很少使用。复制构造函数或工厂方法都是合理的模式


编辑:忘记回答问题了。是的,手动实现复制构造函数。Java==大量的输入。

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));
}

/…另外50-60个字段。

用户应该有像
Name
这样的字段,而不是
String firstName
等,它有first、last、title等

你可以对你的地址、联系方式等做同样的处理。这会使复制构造函数变得更容易

顺便说一句,由于超级用户扩展了用户,您的构造函数将是

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

虽然您可以使用BeanUtils之类的工具来完成您想要做的事情,但如果您需要将用户升级为超级用户或将超级用户降级为用户,您是否使用了正确的抽象

你能重构你的代码,让用户拥有权限或特权吗?通常,当我觉得需要将一个对象更改为层次结构中的另一个对象时,我会重新排列层次结构

例如:

public SuperUser(User theUser) {
    // not legal -> but I am looking for a one-liner to initialize this with values from theUser
    this = theUser;
}
public class User {
   public Integer userId;
   // ...another 50-60 fields
   public Role role;
}

public interface Role {
}
public SuperUserRole implements Role {
}

如果你不想做这个改变,那么波佐的答案就行了

如果你想在Android上使用BeanUtils,但运气不好,可以试试Android java air bridge。

只需下载android-java-air-bridge.jar.zip,解压缩.jar并导入到您的项目中,无需更改任何代码

例如:

import javadz.beanutils.BeanUtils;

BeanUtils.copyProperties(superUser, originalUser);

我认为你没有回答这个问题;)但是,如果我没记错的话,Java中没有真正的专用复制构造函数,那么如何使用它们呢?假设我有一个构造函数:public User(User existing)我没有这样的构造函数……实际上,它假设你可以创建一个
protected
超级构造函数(
protected User(User existing)
)。