2016-04-04 16 views
0

Ich habe eine kleine Anwendung, die eine Reihe von Klassen enthält. Die Anwendung wurde entwickelt, um eine Verbindung zu einem Server und send/recv binary protocol msgs herzustellen.Java-Design Zugriff auf Klassenvariablen

Ich habe diesen Teil mit einer Verbindungs-Manager-Klasse und einer Nachrichtenprozessor-Klasse arbeiten. Der Verbindungsmanager wird instanziiert und erstellt zwei Threads zum Senden und einen zum Empfangen von Nachrichten. Beim Empfang einer Nachricht wird ein neues Nachrichtenprozessorobjekt instantiiert, um das Parsen der Nachricht zu handhaben.

Ich habe jetzt eine GUI mit Connect, Logon etc ... Schaltflächen erstellt.

Die GUI erstellt eine Instanz des Verbindungsmanagers, und wenn die Verbindungstaste gedrückt wird, ruft sie connection manager.connect auf.

Wenn die Anmeldeschaltfläche gedrückt wird, ruft sie connection manager.logon auf.

Das Verbindungsmanager-Objekt hat einen Booleschen Namen, der als verbunden bezeichnet wird.

so kann die GUI Verbindung manager.connected lesen und wahr/falsch sehen. Nun, was ich tun muss, ist Zugriff Connection Manager.connected von meinem Message-Prozessor-Objekt, die innerhalb der Verbindungs-Manager jedes Mal erstellt wird, wenn eine Nachricht empfangen wird. Wenn also der Nachrichtenprozessor eine Anmeldebestätigungsnachricht sieht, kann er connection manager.connected = true setzen und die GUI, die das Verbindungsmanagerobjekt erstellt hat, kann den Wert lesen.

Allerdings kann ich nicht sehen, wie ich auf connection manager.connected vom Message-Prozessor-Objekt zugreifen kann. Ich denke, das ist möglicherweise ein Fehler in meinem Design?

Codebeispiele.

GUI erstellt Verbindungs-Manager-Objekt zu lesen in GUI Textfelder

cm = new ConnectionManager(jTextField1.getText(), jTextField2.getText()) 

Connection Manager einen Booleschen hat verbunden. Es erstellt auch ein Lesen und Schreiben von Netzwerk-Thread

public boolean connected; 
executor.execute(new MessageProcessor(header, message, msgType)); 

Inside MessageProcessor Ich möchte cm.connected aktualisieren - ist das möglich?

Danke

+0

Wie planen Sie den Zugriff auf 'cm' von Ihrem 'MessageProcessor'-Objekt aus? es geht auch um die Kommunikation zwischen Objekten. Wenn Sie nur einen 'ConnectionManager' für Ihre Sende-/Empfangs-Threads haben und wenn Sie immer ein Paar von Threads (send/receive) haben, können Sie einfach' public static boolean connected' verwenden und beim Verbindungsaufbau auf '' setzen wahr '. Dies ist keine gute Lösung von Ihnen haben mehrere thead-Paare (für senden/empfangen Aktivitäten). – ha9u63ar

+0

Ich dachte, ich könnte mein in der GUI erstelltes Verbindungsmanager-Objekt zurück in den Verbindungsmanager übergeben, so dass MessageProcessor darauf zugreifen kann, aber das scheint albern zu sein. –

+0

Als schnell und schmutzig Test können Sie dies tun - aber wirklich, Objekte als Mitglied Variablen zu verwenden, wie @sharonbn demonstriert, ist der richtige Ansatz. – ha9u63ar

Antwort

1

Haben Sie den MessageProcessor selbst erstellt? Wenn dies der Fall könnten Sie einen Parameter im Konstruktor hinzufügen, und einen Verweis auf die Connectionmanager senden:

executor.execute(new MessageProcessor(header, message, msgType, this)); 

Dann wird der Message der Lage sein, durch Connectionmanager verbunden zuzugreifen.

0

Wie planen Sie den Zugriff auf cm von Ihrem MessageProcessor Objekt? es geht auch um die Kommunikation zwischen Objekten. Wenn Sie nur einen ConnectionManager für Ihre Sende-/Empfangs-Threads haben und wenn Sie immer ein Paar Threads (senden/empfangen) haben, können Sie einfach public static boolean connected verwenden und beim Herstellen einer Verbindung können Sie es auf true setzen. Dies ist keine gute Lösung von Ihnen haben mehrere thead-Paare (für senden/empfangen Aktivitäten). Ich habe fast vergessen, bis jemand darauf hingewiesen hat, können Sie einen Parameter übergeben this - Verweis auf wer ruft MessageProcessor Konstruktor. Dies ist jedoch immer noch nicht sehr gut, da jede Änderung der Klassendefinition die Implementierung in MessageProcessor beeinträchtigt.

In einfachen Wort, ja ist es möglich, den Zugriff auf/mutieren connected von Ihrem MessageProcessor - sollten Sie auch den Zugriff auf/mutieren connected mit synchronized Methoden in Betracht ziehen. Wenn Sie jedoch die Lösung verbessern müssen, müssen Sie in Erwägung ziehen, einzelne connectionManager-Objekte zu verwenden. @sharonbn hat dir bereits einige Beispiele gezeigt, wie man das machen kann.

1

MessageProcessor sollte einen Verweis auf seinen aufrufenden ConnectionManager enthalten. Sie können die Referenz im Konstruktor von Messagegeben und speichern sie in einer Instanzvariablen:

public class MessageProcessor { 
    private ConnectionManager cm; 
    public MessageProcessor(ConnectionManager cm) { 
    this.cm = cm; 
    } 
    public void process() { 
    cm.setConnected(false); 
    } 
} 

eine Message Instanziierung:

public class ConnectionManager { 

    public void connect() { 
    MessageProcessor pm = new MessageProcessor(this); 
    } 
    public void setConnected(boolean connected) { 
    this.connected = connected; 
    } 
} 

natürlich Sie Message und Connectionmanager gekoppelt haben. Es gibt (eher) komplexe Lösungen, die es Ihnen ermöglichen, zwischen Implementierungen von MessageProcessor und ConnectionManager zur Laufzeit zu "entscheiden". Dazu gehören das Factory-Muster und die Abhängigkeitsinjektion.