【问题标题】:How to correctly implement communication between Java classes如何正确实现Java类之间的通信
【发布时间】:2016-11-05 17:51:00
【问题描述】:

我是 Java 编程的初学者,目前正在开发一个具有更复杂的类结构和 GUI 的应用程序。这可能是一个愚蠢的问题,但很难谷歌,所以我在这里问。

我有一个主类,如下所示:

package app;

public class App {
    private FirstClass fc;
    private SecondClass sc;

    public App () {
        fc = new FirstClass ();
        sc = new SecondClass ();

        // ... code continues ...
    }
}

假设 SecondClass 是在这个 .java 文件之外定义的(就像 GUI 表单一样)。有没有办法让我从“sc”实例(不传递“this”指针)访问“fc”实例(或 App 实例的其他成员变量)?比如:

class SecondClass {
    public void someMethod() {
        getWhoeverCreatedThisInstance().fc.getSomeData();

        // ... code continues ...
    }
}

如果不是,我做错了什么?我应该以不同的方式设计吗?也许将“fc”设置为静态?但是,如果我希望我的应用程序的更多类相互通信,我应该将它们全部设为静态吗?那么拥有一些非静态的东西有什么意义呢?我可以在“SecondClass”的构造函数中传递“App”或“fc”实例的“this”指针,但是当需要这种行为的类数量增加时,该解决方案似乎并不优雅。

有什么想法吗?提前致谢!

【问题讨论】:

  • 您能否更具体地回答这个问题?像你想只有一个FirstClass 的实例吗?
  • 如果您不将App(又名this)传递给SecondClass 构造函数,那么您如何期望getWhoeverCreatedThisInstance() 工作,因为App 是 谁创建了这个实例?
  • @Blip:是的,只需要一个实例。基本上它是 GUI、数据库连接器等类......
  • @Andreas:嗯,我想知道 Java 是否提供了一些方法来访问“创建者”实例而无需“this”预解决方法
  • @StanleyBarkwill 它没有。传递this 不是“解决方法”。你就是这样做的。

标签: java class


【解决方案1】:

我的建议是实现一个带有接口的回调系统。您的每个相互通信的类都应该实现这些。 这些类应该注册到创建类。 然后他们可以调用创建类中的一个方法,该方法调用每个注册类的接口方法并通过这种方式传递数据。

这个 SO 答案可能会有所帮助 https://stackoverflow.com/a/18279545

【讨论】:

    【解决方案2】:

    如果您想开发 GUI 应用程序,您应该真正了解基本概念。这可能非常耗时,但很有必要,否则你会遇到 奇怪的 行为。我只是给你一个基本的了解来回答你的问题。

    您会想到简单的控制台应用程序,其中通常只有一个线程并且传递对象是有效的。对于多线程,这是致命,即使是static 变量。每个变量或对象都可以同时修改,而其他线程可能无法及时“看到”更改。这是一个复杂的问题,因为每个线程也有缓存和单独的堆栈。简而言之,fcAppsc中可能并不总是同步,因此读写可能不一致。

    现在该怎么办?学习 GUI 编程的概念。通常,您甚至不必为简单的事情共享对象。如果 GUI 控件触发操作,请使用 Listener,查看 here。例如,如果您想访问数据库,那么只需为每个请求或按钮单击创建一个新的连接对象,无论如何。这很容易开始,以后会增加复杂性。

    共享对象的一个​​简单变体是使用synchronized 关键字,它确保方法或字段一次只能由一个线程访问。这是example。另请查看 Java 提供的线程安全数据结构 (java.util.concurrent)。

    出于高级目的,您将拥有一个单独的线程,并使用 Sockets 将它们连接起来以传递消息或数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      相关资源
      最近更新 更多