如何为变量创建更改侦听器?
2022-08-31 22:27:42
假设我使用该语句定义了一些变量。在代码运行时,变量的值会更改。int someVariable;
如何跟踪此变量中的更改?我怎么能实现一些像 onSomeVariableChangedListener 一样的行为的监听器?
我还需要知道一个页面中的其他方法何时被执行,以便我可以在另一个类中设置监听器。
假设我使用该语句定义了一些变量。在代码运行时,变量的值会更改。int someVariable;
如何跟踪此变量中的更改?我怎么能实现一些像 onSomeVariableChangedListener 一样的行为的监听器?
我还需要知道一个页面中的其他方法何时被执行,以便我可以在另一个类中设置监听器。
Java为这种事情提供了一个简单的观察者模式实现,但您需要在管理侦听器通知的方法中设置观察到的变量。如果你无法扩展 Observable,你可以使用组合(即,在你的类中有一个 Observable 实例来管理通知),或者你可以看看 java.util.Observable 来了解如何滚动你自己的版本。
助焊剂.java
import java.util.Observable;
public class Flux extends Observable {
private int someVariable = 0;
public void setSomeVariable(int someVariable) {
synchronized (this) {
this.someVariable = someVariable;
}
setChanged();
notifyObservers();
}
public synchronized int getSomeVariable() {
return someVariable;
}
}
赫拉克利特.java
import java.util.Observable;
import java.util.Observer;
public class Heraclitus implements Observer {
public void observe(Observable o) {
o.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
int someVariable = ((Flux) o).getSomeVariable();
System.out.println("All is flux! Some variable is now " + someVariable);
}
}
这是将变量隐藏在 setter/getter 对后面的众多原因之一。然后,在 setter 中,您可以通知侦听器此变量已以适当的方式进行了修改。正如其他人所评论的那样,没有内置的方法可以完全按照您想要的方式去做,您需要自己实现它。
或者,Benjamin提出了一个有趣的模式,称为装饰器模式,如果无法修改有问题的代码,它可能对您有用。您可以在维基百科上查找更多信息
这个想法是在对象周围构建一个兼容的包装器。假设您有问题的对象是 MyClass 类型。
class MyClass{
public void doFunc(){...}
}
class MyLoggedClass extends MyClass{
MyClass myObject;
public void doFunc(){
//Log doFunc Call
myObject.doFunc();
}
}
而不是
MyClass object = new MyClass();
你会使用
MyClass object = new MyLoggedClass(new MyClass());
现在,您的其余代码将像往常一样使用 object,除了将记录或通知每个函数调用等。
正如您将在维基百科中看到的那样,这通常是通过相关类继承的接口完成的,但在您的情况下,这可能是不可能的。