Come creare un listener di modifiche per la variabile?

Diciamo che ho una variabile definita usando l’istruzione int someVariable; . Mentre il codice viene eseguito, il valore della variabile cambia.

Come posso tracciare i cambiamenti in questa variabile? Come posso implementare un listener che si comporta come onSomeVariableChangedListener?

Devo anche sapere quando è stato eseguito un altro metodo in una pagina in modo da poter impostare un listener in un’altra class.

Questo è uno dei tanti motivi per hide le variabili dietro le coppie setter / getter . Quindi nel setter puoi comunicare al tuo ascoltatore che questa variabile è stata modificata nel modo appropriato. Come hanno commentato gli altri, non esiste un modo per fare esattamente quello che vuoi, devi implementarlo tu stesso.

In alternativa, Benjamin mostra uno schema interessante, chiamato pattern Decorator, che potrebbe essere utile se il codice in questione non può essere modificato. Puoi cercare maggiori informazioni su wikipedia

L’idea è di build un wrapper compatibile attorno a un object. Diciamo che il tuo object in questione è di tipo MyClass.

 class MyClass{ publc void doFunc(){...} } class MyLoggedClass extends MyClass{ MyClass myObject; publc void doFunc(){ //Log doFunc Call myObject.doFunc(); } } 

invece di

 MyClass object = new MyClass(); 

Tu useresti

 MyClass object = new MyLoggedClass(new MyClass()); 

Ora il resto del codice utilizzerà l’object normalmente, tranne che ogni chiamata di funzione verrà registrata, o notificata, ecc.

Come vedrai in wikipedia, questo è tipicamente fatto tramite un’interfaccia ereditata dalla class in questione, ma potrebbe non essere ansible nel tuo caso.

Java offre una semplice implementazione del pattern Observer per questo tipo di cose, ma è necessario impostare la variabile osservata all’interno di un metodo che gestisca le notifiche dei listener. Se non puoi estendere Observable, puoi usare la composizione (cioè avere un’istanza Observable nella tua class per gestire le notifiche), oppure puoi dare un’occhiata a java.util.Observable per avere un’idea di come eseguire il rollover versione.

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; } } 

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); } } 

Credo che dovrai implementare il pattern Observer .

Come scrivere un listener di modifica delle proprietà potrebbe aiutarti È qualcosa che riguarda

Non esiste un modo integrato in Java per ottenere una notifica se il valore di una qualsiasi variabile arbitraria cambia o se è stato chiamato un metodo.