Java 通过几个类共享一个对象

Java 通过几个类共享一个对象,java,Java,我需要在几个类之间共享一个实例。 Connect类有创建URL和下载数据的方法,ui是接口(swing表单),我通过它获取数据以构建URL(URL的日期) 最好的方法是什么 想到: 1) 通过以下方式使其全球化: public class Global { public static Connect c; } 2) 在main()中创建实例,并将其传递给对象 public static void main(String[] args) throws IOException {

我需要在几个类之间共享一个实例。 Connect类有创建URL和下载数据的方法,ui是接口(swing表单),我通过它获取数据以构建URL(URL的日期)

最好的方法是什么

想到:

1) 通过以下方式使其全球化:

public class Global {

public static  Connect c;
}
2) 在main()中创建实例,并将其传递给对象

public static void main(String[] args) throws IOException {

           Connect c = new Connect();   // get url to download from
           ui form = new ui(c);         // the form to get data from 
.
.
.
如果有的话,什么看起来更合理


谢谢。

首选方法通常是将实例传递到任何类所需的构造函数中。这样,就不需要猜测是否有人设置了
Global.c
,以及何时可以使用它。它还清楚地记录了每个类都需要一个
Connect
对象。另一个好处是,如果您的代码曾经发生过更改,并且您希望您的UI类不再依赖同一个全局
Connect
实例,那么您就不再需要更改从该全局上下文中提取魔术实例的所有代码,您只需传入不同的对象即可


按照“为什么全局变量不好”或“为什么单例访问器不好”搜索,你会得到比我解释的更多的细节。它们是有用途的,但是如果你能在前面避免它们,你可能会省去一些后顾之忧。与任何事情一样,每一件事都有权衡。

对于第一个选项,您必须非常小心。在我看来,这里有很多缺点:

  • 它不是一种面向对象的编程风格。它闻起来有点像老式的C代码
  • 如果您应该支持很多这样的实例,会发生什么
  • 现在,如果您需要更改它们(如果这些实例不是不可变的,用花哨的术语来说),会发生什么
  • 现在,如果应用程序变成多线程,会发生什么
虽然这些要点中的一些有效地适用于您描述的第二个解决方案,但就代码的可维护性和可读性而言,第一个解决方案只是一团糟

所以对我来说,第二个更好


希望这有帮助

您需要更具体一些,因为答案取决于具体情况。