作業単位を使用します。作業単位は、どのエンティティ/オブジェクトが「ダーティ」であるか (インメモリ データが永続ストアまたはデータベースと同期していないことを意味します)、およびどれが「クリーン」であるかを判断するために使用されます。
概念を微調整して、どのプロパティが汚れているかを追跡するだけで、準備完了です。
例
(私が 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(...)
を使用して、クリーンなプロパティとダーティなプロパティを判別できます。