如何观察自定义对象在扩展后何时更改



假设我在java中有一个自定义对象:

   public class TestObject {
    private int value = 0;
        public TestObject(int value) {
                this.value = value;
        }
    public void increaseValue() {
        value++;
    }
    }

现在我想知道这个对象是何时被修改的。或者更具体地说,我想知道它的任何字段何时发生了变化(在本例中是值)。此外,如果我扩展TestObject,我仍然希望能够侦听可能发生在该对象上的任何字段更改,包括如果该更改是针对新字段的新字段。

我做了一些研究,发现java自带了各种各样的侦听器,但它们似乎都失败了,因为它们要求你在方法的最后调用侦听器。例如,increevalue()还必须通知TestObject的所有侦听器值已经更改。显然,这对我不起作用,因为可扩展性是必须具备的,而且我不知道从该对象继承的人是否会遵守必须通知侦听器的要求。更不用说,必须为每个mutator方法

编写程序似乎很痛苦

如果能就这个问题提供任何线索,我将不胜感激。

您可以使用Hibernate使用的方法,即工具/代理您的类,在pojo的getter和setter周围添加额外的(侦听器)逻辑。但是,您需要确保所有程序都只使用代理类。

更不用说,为每个人编写程序似乎很痛苦mutator方法

看一下The AspectJ Project。使用用于字段分配的切入点,您可以很容易地在生产方面实现这一点。

public privileged aspect TestObjectObserver {
    before(Object o) : set(* TestObject.*) && args(o) {
      // notify listeners
    }
} 
// runs before field assignment to any field of TestObject. The value to be
// assigned is converted to an object type (int to Integer, for
// example) and named o in the body
// the aspect needs to be declared privileged so access private fields

显然这对我不起作用,因为可扩展性是必须的我不知道如果继承了那个对象的人呢将遵守必须通知侦听器

的要求

你的方法不在正确的路径上。

您不能强制派生类保持基类的类不变量,因为继承可以允许后代类以某种方式改变实现,从而使它们从父类的角度来看无效。

在你的例子中,派生类在修改时可能调用也可能不调用通知。

在这种情况下,你应该围绕Composition而不是Inheritence进行建模
组合与继承

例如:

class Value{    
    private int value;   
     public void increaseValue() {  
            value++;  
     }  
}

Value知道如何自增。

class ValueHolder extends Observable {  
       private Value theValue;  
       public ValueHolder(Value v){  
          theValue = v;  
       }
       public void modifyValue(String methodName)(){  
           Method method = theValue.getClass().getMethod(methodName, null);  
           method.invoke(theValue,null);//Since it has no args           
           setChanged();  
           notifyObservers();  
       }  
    }

所以所有的代码如下:

ValueHolder vh = new ValueHolder(new Value(10));  
//registration of listeners
vh.modifyValue("increaseValue");  
//So if you extend the Value 
class DerivedValue extends Value{    
    private int y;   
     public void increaseY() {  
            y++;  
     }  
}  
ValueHolder vh = new ValueHolder(new DerivedValue());  
//registration of listeners
vh.modifyValue("increaseY);    

所以现在的问题是对象的使用是通过holder。
然后通知就会出现

最新更新