0

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

目的

public class TangoObject {

  String a;
  String b;
 // so on
public void update(TangoObject to){
  setA(to.getA());
  setB(to.getB());
   }
}

现在在执行下面的代码时

 SomeService(TangoObject to){
   //call processor
    someObject.processor(to);
    doSomethingelse(to);
  }

处理器代码

class SomeObject {
   public void processor(TangoObject to) {
     TangoObject newTo = new TangoObject();

     // manipulate the new object to
      tangoObject.update(newTo); -- replacing original tangoObject with new one as some properties where changed
   }
 }
4

3 回答 3

1

我认为您的方法没有任何问题。一切都保持简单易读,您只需在添加新属性时更改一种方法。

于 2013-06-04T19:54:46.773 回答
0

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

如果您喜欢拥有所有 setter 和 getter 的结构,并且所有使用“Pojo”的代码都允许这样做,那么您绝对没有理由不能使用:

公共类 TangoObject {
    HashMap vars=new HashMap();

    公共字符串 getA() {
        返回(字符串)(vars.get(“a”));
    }

    公共无效setA(字符串a){
        vars.put("a",a);
    }

    公共int getB(){
        整数 i=vars.get("b");
        return (int) (i == null ? 0 : i);
    }
  ...

    公共无效更新(TangoObject 到){
        to.vars.clear();
        to.vars.copyFrom(vars);
    }
}

我并不是说这是有史以来最伟大的事情,但如果你的类只是一个 bean 类(除了获取和检索它们之外,没有任何意义使用变量),那么即使有单独的变量也没有太大的优势。“类型安全”由 setter 和 getter 确保,因此它并不比其他解决方案差。

就个人而言,我真的不喜欢豆形图案。我更喜欢完全没有 setter 和 getter 的 pojo——它们在其中有自己的业务逻辑,并且不会在任何使用它们的地方随意散布在整个代码中。如果你的班级没有任何逻辑,那它就不应该是一个班级——但这从长远来看并不是一个普遍的观点,事实上,有时我想我可能是唯一一个有这种感觉的人。

于 2013-06-04T20:38:44.823 回答
0

所以你不喜欢这个方法:

public void update(TangoObject to){
  setA(to.getA());
  setB(to.getB());
}

因为每当您向TangoObject类添加新属性时都需要对其进行维护。

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

public void update(TangoObject to){
  BeanUtils.copyProperties(to, this);
}

当您向类添加属性时,您不需要维护它TangoObject

编辑:如果您不想在依赖项中包含 BeanUtils,则可以使用反射来实现此功能。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);
    }
}

实际上,您并没有替换实例,而只是替换了它的状态,即其字段的值。实例to保持不变,但另一个对象的状态通过复制其属性在其上转移。

于 2013-06-04T19:55:49.493 回答