Sin*_*ami 40 java variables event-handling
假设我使用该语句定义了一些变量int someVariable;.代码运行时,变量的值会发生变化.
如何跟踪此变量的变化?我怎样才能实现一些行为类似onSomeVariableChangedListener的Listener?
我还需要知道一个页面中的其他方法何时被执行,所以我可以在另一个类中设置一个Listener.
Kev*_*don 36
Java为您提供了一种简单的Observer模式实现,但是您需要在管理侦听器通知的方法中设置您的观察变量.如果你不能扩展Observable,你可以使用合成(即,在你的类中有一个Observable实例来管理通知),或者你可以看一下java.util.Observable来了解如何滚动自己的版.
Flux.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;
}
}
Run Code Online (Sandbox Code Playgroud)
Heraclitus.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);
}
}
Run Code Online (Sandbox Code Playgroud)
Kar*_*k T 30
这是将变量隐藏在setter/getter对后面的众多原因之一.然后在setter中,您可以通知您的侦听器已经以适当的方式修改了此变量.正如其他人所评论的那样,没有内置的方法可以完全按照您的要求进行操作,您需要自己实现它.
另外,Benjamin提出了一个有趣的模式,称为Decorator模式,如果无法修改相关代码,这可能对您有用.您可以在维基百科上查找更多信息
我们的想法是围绕一个对象构建一个兼容的包装器.让我们说你的对象是MyClass类型.
class MyClass{
publc void doFunc(){...}
}
class MyLoggedClass extends MyClass{
MyClass myObject;
publc void doFunc(){
//Log doFunc Call
myObject.doFunc();
}
}
Run Code Online (Sandbox Code Playgroud)
代替
MyClass object = new MyClass();
Run Code Online (Sandbox Code Playgroud)
你会用的
MyClass object = new MyLoggedClass(new MyClass());
Run Code Online (Sandbox Code Playgroud)
现在你的其余代码将按照正常使用对象,除了每个函数调用将被记录,或通知等.
正如您将在维基百科中看到的,这通常是通过所讨论的类继承的接口来完成的,但在您的情况下这可能是不可能的.