1

MyClass という POJO があります。MyClass には 100 個のゲッターとセッターがあります (たとえば)

2 つのインスタンスを作成します。インスタンス A とインスタンス B。

ユーザーがインスタンス B の任意のフィールドの値を何らかの方法で変更します。

インスタンス A の値の変化を更新できるように、インスタンス A とインスタンス B を比較できる方法または近道はありますか?

更新済み混乱を明確にするだけです。

言ってみよう

インスタンス A = サーバー側で JDO を介して永続化された既存のレコードを表す MyClass のインスタンス。MyClass には foo="bar0" のインスタンス変数があります。

インスタンス B = ユーザーが任意のフィールドを編集した MyClass のインスタンス、つまり foo="bar1"。インスタンス B は、Android クライアントから提供されたデータから取得されます。

したがって、インスタンス A を更新する方法を表すインスタンス B にある MyClass の任意のインスタンス変数である可能性があります。

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

免責事項:私はGuiceのファンですが、ITです。は。驚くばかり。

これは共有状態の問題のように聞こえます。状態は静的であってはなりません。おそらくGUICEを使用してAのシングルトンインスタンスを管理しているはずです(なぜAとBが必要なのかわからない)

とにかく、空想してインターセプトしたい場合は、GUICEA.setFooのAOPサポートを確認する必要があります。

于 2012-09-30T02:24:48.380 に答える
0

あなたの場合、AOPは必要ありませんが、イントロスペクションが必要です。

春を使っていますか?その場合、BeanWrapperImpl クラスが非常に良い出発点である場合は、A の周りに Bean ラッパーを定義し、B の周りに Bean ラッパーを定義します。次に、そのプロパティを簡単に繰り返し、ある値から別の値に値をコピーします。

それをしたくない場合は、Apache Commons BeanUtils が同じ機能を提供します。

于 2012-09-30T04:26:14.373 に答える
-1

アスペクト指向プログラミング(AspectJのようなものを使用)を使用するか、あるオブジェクトのプロパティを別のオブジェクトと比較するリフレクションを使用してソリューションを作成することができます。

于 2012-09-30T02:27:50.797 に答える