1

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

   public class TestObject {

    private int value = 0;

        public TestObject(int value) {
                this.value = value;
        }

    public void increaseValue() {
        value++;
    }

    }

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

我已经进行了一些研究,发现了 java 附带的各种侦听器,但它们似乎都失败了,因为它们要求您在方法结束时调用侦听器。例如,increaseValue() 还必须通知 TestObject 的所有侦听器值已更改。显然这对我不起作用,因为可扩展性是必须具备的,而且我不知道从该对象继承的人是否会遵守他们必须通知听众的要求。更不用说,必须为每个 mutator 方法进行编程似乎很痛苦

如果可以对这个主题有所了解,将不胜感激。

4

3 回答 3

1

更不用说,必须为每个 mutator 方法进行编程似乎很痛苦

看看AspectJ 项目您可以使用现场分配的切入点在生产方面非常轻松地实现这一点。

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
于 2011-10-10T07:29:16.323 回答
1

您可以使用Hibernate 使用的方法,即工具/代理您的类来围绕 POJO 的 getter 和 setter 添加额外的(侦听器)逻辑。但是你需要确保所有这些都只使用代理类。

于 2011-10-10T07:28:17.013 回答
1

显然这对我不起作用,因为可扩展性是必须具备的,而且我不知道从该对象继承的人是否会遵守他们必须通知听众的要求

您的方法不正确。

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

在您的情况下,派生类可能或可能不会在修改时调用通知。

在这种情况下,您应该建模 arroundComposition而不是Inheritence
Composition vs Inheritence

对于您的示例:

class Value{    
    private int value;   
     public void increaseValue() {  
            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);    

所以现在的问题是对象的使用是通过持有者进行的。
然后通知就会发生。

于 2011-10-10T07:39:25.020 回答