1

我有一个名为 MyClass 的 POJO。MyClass 有 100 个 getter 和 setter(例如)

我创建了两个实例。实例 A 和实例 B。

用户以某种方式更改了实例 B 上任意字段的值。

有没有一种方法或捷径可以比较实例 A 和实例 B,以便我可以将值的变化更新为实例 A?

更新好的,只是为了澄清一些混乱。

我们就说

实例 A = MyClass 的一个实例,它表示通过 JDO 在服务器端持久保存的现有记录。MyClass 有一个实例变量 foo="bar0";

实例 B = 用户已编辑任意字段的 MyClass 实例,即 foo="bar1"。实例 B 来自 Android 客户端提供的数据。

所以它可以是 MyClass 上的任何实例变量,它可能在实例 B 中,它表示应该如何更新实例 A。

4

4 回答 4

1

使用工作单元。工作单元用于确定哪些实体/对象是“脏的”——这意味着它们的内存数据与持久性存储或数据库不同步——哪些是“干净的”。

只需调整概念以跟踪哪些属性是脏的,你就可以开始了。

例子

(我写Java已经有一段时间了,我这台机器上没有Java,所以可能会有一些错误)

MyClass.java

public class MyClass extends ChangeObservable {

    private String name;
    private Age int;

    public MyClass(name, age) {
        // when the object is first created,
        // I'm assuming that the "clean" values are provided
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public void setName(n) {
        name = n;
        this.fireChangeEvent("name");
    }
    public String getAge() { return age; }
    public void setAge(a) {
        age = a;
        this.fireChangeEvent("age");
    }

}

UnitOfWork.java

public class UnitOfWork implements ChangeListener {    

    // dunno if this is the most efficient implementation...
    private HashSet<String> dirties = new HashSet<String>();
    private Observable obj;

    public UnitOfWork(Observable obj) {
        this.obj = obj;
        obj.registerChangeListener(this);
    }

    public void registerDirty(propName) {
        // probably more code needed...
        dirties.add(propName);
    }

   public HashSet<String> getDirtyProperties() {
        // probably more code needed...
       return new HashSet<String>(dirties);
   }

   public void onChangeEvent(propName) {
       this.registerDirty(propName);
   }

    // note: a UnitOfWork needs more functionality than this!
    // I've implemented the bare minimum for the example
    // but it would also need methods like `registerClean(...)`

}

Driver.java

public class MyDriver {

    public static void main(String[] argv) {
        MyClass myObj = new MyClass("Richard", 3);
        UnitOfWork uow = new UnitOfWork(myObj);
        myObj.setName("Mark");
        for(String propName : uow.getDirtyProperties()) {
            System.out.print(propName);
        }
    }

}

...现在UnitOfWork.getDirtyProperties(...)可以用来确定哪些属性是干净的和肮脏的。

于 2012-09-30T03:48:38.507 回答
0

只是不同意,在您的情况下,您不需要 AOP,但您需要自省。

你用的是弹簧吗?如果是这种情况,BeanWrapperImpl 类是一个非常好的开始,您可以在 A 周围定义一个 bean 包装器,在 B 周围定义一个 bean 包装器。然后轻松迭代其属性,并将值从一个复制到另一个。

如果您不想这样做,Apache Commons BeanUtils 提供了相同的功能。

于 2012-09-30T04:26:14.373 回答
0

免责声明:我是 Guice 的粉丝,但它是它。是。惊人的。

这听起来像是共享状态的问题。状态不应该是静态的,您可能应该使用 GUICE 来管理 A 的单例实例。(不确定为什么需要 A 和 B)

无论如何,如果你想看中和拦截A.setFoo,你应该看看GUICE 中的 AOP 支持。

于 2012-09-30T02:24:48.380 回答
-1

您可以使用面向方面的编程(使用AspectJ之类的东西),也可以使用反射编写解决方案,将一个对象的属性与另一个对象的属性进行比较。

于 2012-09-30T02:27:50.797 回答