Java 如何观察自定义对象在更改后的变化';延伸

Java 如何观察自定义对象在更改后的变化';延伸,java,inheritance,field,onchange,listeners,Java,Inheritance,Field,Onchange,Listeners,假设我有一个java自定义对象: public class TestObject { private int value = 0; public TestObject(int value) { this.value = value; } public void increaseValue() { value++; } } 现在我想知道这个对象什么时候被修改。或者更具体地

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

   public class TestObject {

    private int value = 0;

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

    public void increaseValue() {
        value++;
    }

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

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

如果能对这个问题有所了解,我们将不胜感激。

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

更不用说,为每个人编写程序似乎都很痛苦 变异子法

看一看。在生产方面,您可以通过使用

显然,这对我不起作用,因为扩展性是必须的 我不知道,如果从那个物体继承的人 将遵守他们必须通知听众的要求

你的方法不正确

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

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

在这样的情况下,您应该围绕
组合
建模,而不是
继承

例如:

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);    
因此,现在的问题是,对象的使用是通过持有者进行的。

然后通知将发生。

请参阅我的回复——生产方面将解决必须使用代理的问题。虽然这看起来是一个潜在的复杂解决方案,但它与我所寻找的最为一致。请参阅@Andrey Adamovich的回复——代理将解决必须使用AspectJ的问题…:-)这是不对的。继承背后的思想是派生类需要服从基类的不变量。这就是LSP的全部意义,不是吗?具体来说,基类方法的不变量是pf参数类型、返回值类型和异常。这里的问题是基类想要在派生类上强制使用不变量。是的,你是对的。强制使用不变量是程序员的责任。我同意。这也是我在这里要说的。不可能强制执行基类的不变量。不,强制执行不变量不是程序员的责任,语言不允许您破坏不变量。这个论点用
UnsupportedOperationException
来解释,但理论上,子类不能破坏超类不变量。@赫马尔:我不确定我们讨论的是同一件事。例如,如果在基类中,条件
a
在所有情况下都应保持有效(
a
b
be成员字段)您如何确保扩展类和重写方法的程序员保留该不变量?您不能。这是我在这里的观点。对不起,但我有点困惑。你们能为我提供一点我应该研究的方向吗?
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);