2016-05-17 12 views
-1

Gibt es eine Möglichkeit, eine Variable zu erstellen, die ich in Klasse A ändern kann und durch diese Änderungen beeinflussen, was in einer anderen Klasse B passieren wird. Ich hoffe, Sie verstehen.nicht-statische globale Variable in Java

Etwas wie folgt aus:

class A{ 
public int var = 0; 

} 

Und Verwendung Wert der Variablen var wie folgt aus:

class B{ 
if(var == 0) 
    { 
    System.out.println("right now, var is equal 0"); 
    } 
else if(var == 1) 
    { 
    System.out.println("right now, var is equal 1"); 
    } 
} 

Auch wie man sehen kann, var kann nicht statisch sein, weil ich es Wert ist ändern müssen während der Ausführung der App.

+0

Nicht möglich, es sei denn, 'B' hat einen Verweis auf eine (gemeinsame?) Instanz von' A'. Aber warum würden Sie für eine globale Variable nicht statisch verwenden? Und natürlich das Erforderliche "Warum benutzt du globale Variablen?" – shmosel

+3

Es gibt nichts, was Sie daran hindert, den Wert einer statischen Variable während der Laufzeit zu ändern. – Thilo

+3

Sehen Sie sich das Designmuster des Beobachters an, weil es so aussieht, als ob Sie es wollen - um über Änderungen in einem anderen Objekt informiert zu werden. –

Antwort

1

Ich würde es tun, indem ich eine Referenz der Klasse B in Klasse A hätte, damit A auch B ändern könnte, wenn es nötig war. Zum Beispiel:

public class A { 

    private int var; 
    private B b; 

    public A(B b) { 
     this.var = 0; 
     this.b = b; 
    } 

    public void set(final int var) { 
     this.var = var; 
     b.set(var); 
    } 

} 

public class B { 

    private int var = 0; 

    public void set(final int var) { 
     this.var = var; 
    } 

} 
+0

@ SamTebbs33 Könnten Sie bitte meine 'System.out.println()' verwenden, damit ich verstehen kann, welche Klasse das tut. Nach meiner Frage. –

1

Sie können das beobachtete Beobachtermuster verwenden.

public class A extends Observable { 

    private int var = 0; 

    public void setVar(int val) { 
     this.var = val; 
     notifyObservers(); 
    } 

} 

public class B implements Observer { 

    public void init(A a) { 
     a.addObserver(this); 
    } 

    @Override 
    public void onUpdate(Observable obs, Object arg) { 
     // Do something when A is updated 
     if(var == 0) System.out.println("right now, var is equal 0"); 
     else if(var == 1) System.out.println("right now, var is equal 1"); 
    } 

} 

Das System funktioniert so, dass AObservable wird, was bedeutet, dass andere Klassen aktualisiert werden kann, wenn etwas in A ändert (die anderen Klassen von A benachrichtigt fordern notifyObservers()). Die onUpdate() Methode im Beobachter wird dann mit dem Observable (hier A) als erstes Argument aufgerufen. Wenn Sie notifyObservers() mit einem Object Argument aufrufen, wird das Object Argument in onUpdate() diesen Wert verwenden. Hier

ist der Steuerablauf:

A: setVar -> A: notifyObservers -> B: onUpdate

+1

Nun, darüber rede ich. 1+ –

+0

@ SamTebbs33 Danke für deine Lösung. Gibt es eine Möglichkeit, dieses Problem zu implementieren? Kann meine Klasse von zwei Klassen nicht erweitern. –

+0

@ P.Barbra Nun, ich habe Ihnen hier eine Beispielimplementierung gegeben, Sie müssen sie an Ihre eigenen Bedürfnisse anpassen. Edit: Ich habe den Code aus Ihrer Frage zu 'OnUpdate()' in 'B' hinzugefügt – SamTebbs33

0

Obwohl Beobachter-Muster durch andere Antwort vorgeschlagen ist eigentlich ein sauberer Ansatz, da die OP scheint don‘ t hat sogar richtiges Verständnis über grundlegenden Konzepte von Java als OOP (zB was eine Objektinstanz ist), ich glaube, was er sucht etwas noch basisch ist, die ein Verweis auf ein anderes Objekt ist:

class A { 
    private int value = 0; 

    // getters and setters 
} 

class B { 
    private A a; 

    // using constructor to have object reference populated 
    // is only ONE OF THE WAYS 
    public B(A a) { 
     this.a = a; 
    } 

    public void foo() { 
     System.out.println("my referred A value " + this.a.getValue(); 
    } 
} 

Natürlich müssen Sie richtig konstruieren du sie. Irgendwo in Ihrem Code:

A a = new A(); 
B b = new B(a); 
b.foo(); 
a.setValue(100); 
b.foo();