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