我是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”实例访问“fc”实例(或App实例的其他成员变量)(不传递“this”指针)?类似的东西:
class SecondClass {
public void someMethod() {
getWhoeverCreatedThisInstance().fc.getSomeData();
// ... code continues ...
}
}
如果没有,我做错了什么?我的设计应该不同吗?也许将“fc”设置为静态?但是,如果我希望我的应用程序的更多类能够相互通信,我应该将它们全部静态化吗?那么有什么非静态的东西呢?我可以在“SecondClass”的构造函数中传递“App”或“fc”实例的“this”指针,但是当需要此行为的类数量增加时,该解决方案似乎并不优雅。
有什么想法吗?提前谢谢!
答案 0 :(得分:1)
我的建议是实现一个带接口的回调系统。您的每个类都相互通信应该实现这些。 这些类应该注册到创建类。 然后,他们可以在create类中调用一个方法,该方法调用每个已注册类的接口方法并以这种方式传递数据。
这个答案可能有所帮助 https://stackoverflow.com/a/18279545
答案 1 :(得分:0)
如果您想开发GUI应用程序,您应该真正了解基本概念。这可能非常耗时,但这是必要的,否则您将会加密奇怪的行为。我会给你一个基本的理解来回答你的问题。
您会想到简单的控制台应用程序,您通常只有一个线程,并且传递对象是有效的。对于多个线程,即使使用static个变量,这也是致命。每个变量或对象都可以同时修改,而另一个帖子可能无法看到' 及时更改。这是一个复杂的问题,因为每个线程也有缓存和单独的堆栈。简而言之,fc
和App
中的sc
可能并不总是同步,因此读取和写入可能不一致。
现在该怎么办?学习GUI编程的概念。通常,您甚至不必为简单的事物共享对象。如果GUI控件触发操作,请使用Listener
,查看here。例如,如果要访问数据库,则只需为每个请求或按钮单击创建一个新的连接对象。这很容易启动,以后会增加复杂性。
共享对象的一个简单变体是使用synchronized
关键字,这可确保方法或字段一次只能被一个线程访问。这是一个example。另请参阅Java提供的线程安全数据结构(java.util.concurrent)。
出于高级目的,您将拥有一个单独的线程,您可以将它们与套接字连接以传递消息或数据。