Java设计访问类变量

时间:2016-04-04 11:19:03

标签: java oop

我有一个包含许多类的小应用程序。该应用程序旨在连接到服务器并发送/ recv二进制协议消息。

我让这部分使用连接管理器类和消息处理器类。连接管理器实例化并创建一个要发送的线程和一个用于recv消息的线程。在接收到消息时,实例化新的消息处理器对象以处理消息的解析。

我现在已经创建了一个具有连接,登录等按钮的GUI。

gui创建一个连接管理器实例,当按下连接按钮时,它调用connection manager.connect。

按下登录按钮时,它会调用connection manager.logon。

连接管理器对象有一个名为connected的布尔值。

所以gui可以读取连接manager.connected并查看true / false。现在我需要做的是从我的消息处理器对象访问连接manager.connected,每次收到消息时都会在连接管理器中创建。因此,如果消息处理器看到登录确认消息,则可以设置连接manager.connected = true,并且创建连接管理器对象的GUI可以读取该值。

但是我无法看到如何从消息处理器对象访问连接manager.connected。我认为这可能是我设计中的一个缺陷?

代码示例。

GUI在GUI文本字段中创建连接管理器对象读取

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

Connection Manager连接了一个布尔值。它还会从网络线程

创建读写
public boolean connected; 
executor.execute(new MessageProcessor(header, message, msgType));

在MessageProcessor内部我想更新cm.connected - 这可能吗?

由于

3 个答案:

答案 0 :(得分:1)

您是否自己创建了MessageProcessor?如果是这样,您可以在构造函数中添加参数并发送对ConnectionManager的引用:

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

然后MessageProcessor将能够通过ConnectionManager访问连接。

答案 1 :(得分:1)

MessageProcessor应该保存对其调用ConnectionManager的引用。您可以在MessageProcessor的构造函数中传递引用并将其存储在实例变量中:

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

实例化MessageProcessor:

public class ConnectionManager {

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

当然你已经连接了MessageProcessor和ConnectionManager。有(相当)复杂的解决方案,允许您决定"在MessageProcessor和ConnectionManager的实现之间的运行时。这些包括工厂模式和依赖注入。

答案 2 :(得分:0)

您打算如何从cm对象访问MessageProcessor?它还涉及对象之间的通信。如果你的发送/接收线程只有一个ConnectionManager,并且你总是有一对线程(发送/接收),你可以简单地使用public static boolean connected并在建立连接时将其设置为true。这不是一个很好的解决方案,你有多个thead-couple(发送/接收活动)。我差点忘了,直到有人指出,你可以传递参数this - 引用谁正在调用MessageProcessor构造函数。但是,这仍然不是很好,因为类定义中的任何更改都会损害MessageProcessor中的实现。

简单来说,是的,可以从connected访问/变异MessageProcessor - 您还应该考虑使用synchronized方法来访问/变异connected。但是,如果您需要更好地解决方案,则需要考虑使用单个connectionManager对象。 @sharonbn已经向您展示了如何实现这一目标的一些例子。