Java 如何用相同类型的新实例替换pojo对象?

Java 如何用相同类型的新实例替换pojo对象?,java,Java,我需要用新的属性替换对象的某些属性。最好的方法是什么?它应该是可靠的,在未来,如果我们添加更多的属性,它不应该打破任何地方。我可以创建一个为每个属性设置的方法,但每次向对象添加新属性时,都需要修改此方法。有没有最好的办法 对象 现在执行以下代码时 SomeService(TangoObject to){ //call processor someObject.processor(to); doSomethingelse(to); } 处理器代码 我看你的方法没有任何

我需要用新的属性替换对象的某些属性。最好的方法是什么?它应该是可靠的,在未来,如果我们添加更多的属性,它不应该打破任何地方。我可以创建一个为每个属性设置的方法,但每次向对象添加新属性时,都需要修改此方法。有没有最好的办法

对象 现在执行以下代码时

 SomeService(TangoObject to){
   //call processor
    someObject.processor(to);
    doSomethingelse(to);
  }
处理器代码
我看你的方法没有任何问题。所有内容都保持简单易读,添加新属性时只需更改一个方法。

因此您不喜欢该方法:

public void update(TangoObject to){
  setA(to.getA());
  setB(to.getB());
}
因为每当您向
TangoObject
类添加新属性时,都需要维护它

可以通过使用更动态的方式将属性从一个TangoObject复制到另一个来避免这种情况。 可以使用复制属性。因此,您的方法变成:

public void update(TangoObject to){
  BeanUtils.copyProperties(to, this);
}
在向
TangoObject
类添加属性时,不需要维护它

编辑: 如果不想在依赖项中包含Beanutil,可以使用反射实现此功能。如果
TangoObject
不继承,您的情况会更简单,因为您可以使用
class.getDeclaredFelds()
获取所有字段。 您可以执行以下操作:

static <T> void copy(T from, T to) throws IllegalArgumentException, IllegalAccessException {
    Class<?> clazz = from.getClass();
    Field[] fields = clazz.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        fields[i].setAccessible(true);
        Object value = fields[i].get(from);
        fields[i].set(to, value);
    }
}
static void copy(T from,T to)抛出IllegalArgumentException,IllegalAccessException{
Class clazz=from.getClass();
Field[]fields=clazz.getDeclaredFields();
for(int i=0;i

实际上,您不是在替换实例,而是替换实例的状态,即其字段的值。实例
保持不变,但另一个对象的状态是通过复制其属性在其上传输的。

您可以创建一个复制构造函数,但这具有相同的限制--不复制就无法添加字段

如果您喜欢使用“Pojo”的所有setter和getter以及所有代码的结构,那么绝对没有理由不使用:

public class TangoObject { HashMap vars=new HashMap(); public String getA() { return (String) (vars.get("a")); } public void setA(String a) { vars.put("a",a); } public int getB() { Integer i=vars.get("b"); return (int) (i == null ? 0 : i); } ... public void update(TangoObject to){ to.vars.clear(); to.vars.copyFrom(vars); } } 公共类TangoObject{ HashMap vars=新的HashMap(); 公共字符串getA(){ 返回(字符串)(vars.get(“a”)); } 公共空集a(字符串a){ 变量put(“a”,a); } 公共int getB(){ 整数i=vars.get(“b”); 返回值(int)(i==null?0:i); } ... 公共无效更新(TangoObject to){ to.vars.clear(); to.vars.copyFrom(vars); } } 我并不是说这是有史以来最伟大的事情,但是如果您的类只是一个bean类(意味着内部除了获取和检索变量之外没有任何东西使用这些变量),那么即使有单独的变量也没有什么巨大的优势。“类型安全性”由setter和getter保证,因此它并不比其他解决方案差


就我个人而言,我真的不喜欢豆子图案。我更喜欢完全没有setter和getter的pojo——它们内部有自己的业务逻辑,不会随意地在代码中传播,不管它们在哪里使用。如果你的类没有任何逻辑,它就不应该是一个类——但从长远来看,这不是一个常见的观点,事实上有时我认为我可能是唯一有这种感觉的人。

你必须使用反射或。当然,另一种选择是用新对象替换旧对象,而不是更新旧对象以匹配新对象。当然,要求您能够找到所有引用。我考虑过,但看起来我需要为它添加一个外部jar。还有其他解决方案吗?事实上,我认为原来的方案要简单得多。@user1595858看看如何将状态从一个对象复制到另一个对象。
static <T> void copy(T from, T to) throws IllegalArgumentException, IllegalAccessException {
    Class<?> clazz = from.getClass();
    Field[] fields = clazz.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        fields[i].setAccessible(true);
        Object value = fields[i].get(from);
        fields[i].set(to, value);
    }
}
public class TangoObject { HashMap vars=new HashMap(); public String getA() { return (String) (vars.get("a")); } public void setA(String a) { vars.put("a",a); } public int getB() { Integer i=vars.get("b"); return (int) (i == null ? 0 : i); } ... public void update(TangoObject to){ to.vars.clear(); to.vars.copyFrom(vars); } }