2013-03-15 9 views
30

Nehmen wir an, ich habe eine Variable definiert mit der Anweisung int someVariable;. Während der Code ausgeführt wird, ändert sich der Wert der Variablen.Wie erstelle ich den Change Listener für die Variable?

Wie kann ich die Änderungen in dieser Variablen verfolgen? Wie kann ich einen Listener implementieren, der sich wie onSomeVariableChangedListener verhält?

Ich muss auch wissen, wenn eine andere Methode auf einer Seite ausgeführt wurde, damit ich einen Listener in einer anderen Klasse festlegen kann.

+0

Interessieren Sie sich diese zum Zweck der Fehlersuche in tut oder tun Sie dies in der Produktion Code verwenden möchten? –

+0

in Produktionscode – Sinigami

Antwort

26

Dies ist einer der vielen Gründe, Variablen hinter Setter/Getter Paare zu verbergen. Im Setter können Sie dann Ihrem Listener mitteilen, dass diese Variable in der entsprechenden Weise geändert wurde. Wie die anderen bemerkt haben, gibt es keine eingebaute Möglichkeit, genau das zu tun, was Sie wollen, Sie müssen es selbst implementieren.

Alternativ zeigt Benjamin ein interessantes Muster an, das Decorator-Muster, das für Sie nützlich sein könnte, wenn der betreffende Code nicht geändert werden kann. You can look up more info at wikipedia

Die Idee ist, einen kompatiblen Wrapper um ein Objekt zu erstellen. Nehmen wir an, Ihr Objekt ist vom Typ MyClass.

class MyClass{ 
    publc void doFunc(){...} 
} 

class MyLoggedClass extends MyClass{ 
    MyClass myObject; 

    publc void doFunc(){ 
     //Log doFunc Call 

     myObject.doFunc(); 

    } 
} 

statt

MyClass object = new MyClass(); 

würden Sie verwenden

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

Jetzt Ihr Rest des Codes würde Objekt wie für normale verwenden, mit der Ausnahme, dass jeder Funktionsaufruf protokolliert werden, oder benachrichtigt usw.

Wie Sie in wikipedia sehen, wird dies in der Regel über eine Schnittstelle, die die Klasse in der Frage erbt von, aber das ist in Ihrem Fall möglicherweise nicht möglich.

+1

Vielleicht möchten Sie das Konzept der Decorators erwähnen, das eine Möglichkeit darstellt, eine Lösung für dieses Problem zu implementieren, vorzugsweise mit einem einfachen Beispiel. –

+0

in Ihrer letzten Zeile, meintest du 'MyClass object = new MyLoggedObject ...' anstelle von '... myLoggedClass ...'? Wenn ja, könnten Sie bitte updaten? Und wenn es korrekt ist, können Sie es bitte erklären? Vielen Dank. – dbconfession

+0

@dbconfession gutes Auge, ich werde es anders herum reparieren, indem Sie die Klasse umbenennen –

1

Es gibt keine eingebaute Möglichkeit in Java eine Benachrichtigung zu erhalten, wenn sich der Wert einer beliebigen Variablen ändert oder wenn eine Methode aufgerufen wurde.

3

How to Write a Property Change Listener könnten Sie helfen Es ist etwas beziehen

+0

Soweit ich sagen kann er auf Änderungen an einer Variablen und _not_ eine Eigenschaft –

+0

@BenjaminGruenbaum hören wollen, nach meinem Wissen 'Variablen' einer Bohne oder Klasse werden als' Eigenschaft' genannt, ist es nicht über eine '.property' Datei. – Patriks

33

Java gibt Ihnen eine einfache Beobachter-Muster-Implementierung für diese Art der Sache, aber Sie werden Ihre beobachtete Variable müssen innerhalb einer Methode festlegen, die Zuhörer Benachrichtigungen verwaltet. Wenn Sie nicht beobachtbar erweitern können, können Sie entweder Zusammensetzung (dh sie haben eine beobachtbare Instanz in Ihrer Klasse-Benachrichtigungen zu verwalten), oder Sie können einen Blick auf java.util.Observable nehmen eine Vorstellung davon zu bekommen, wie Sie Ihre eigene Rolle Ausführung.

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

Scheitert dies mit der Reflexion, habe ich eine ähnliche Anforderung an den Hörer ändern. Aber variable Werte werden von der Planierraupe eingestellt, die über Reflektion arbeitet. – Vikash

Verwandte Themen