如何在 Java 中的不同类之间共享数据

2022-09-04 19:59:46

在Java中在单独的类之间共享数据的最佳方法是什么?我有一堆变量,这些变量由不同的类以不同的方式在单独的文件中使用。让我试着举例说明我的问题的简化版本:

这是我之前的代码:

public class Top_Level_Class(){
    int x, y;

    // gets user input which changes x, y;
    public void main(){
       int p, q, r, s;
       // compute p, q, r, s
       doA(p,q,r);
       doB(q,r,s);
    }

    public void doA(int p, int q, int r){
       // do something that requires x,y and p, q, r
    }

    public void doB(int q, int r, int s){
       // does something else that requires x, y and q, r, s
    }
}

现在它看起来像这样:

public class Top_Level_Class(){
    int x, y;
    SomeClass1a a = new SomeClass1a();
    SomeClass1a b = new SomeClass1b();
    // gets user input which changes x, y;
    public void main(){
       int p, q, r, s;
       // compute p, q, r, s
       a.doA(p,q,r);
       b.doB(q,r,s);
    }

public class SomeClass1a() {  // in its own separate file
    public void doA(int p, int q, int r){
       // do something that requires x,y and p, q, r
    }
}


public class SomeClass1b() {  // in its own separate file
    public void doB(int q, int r, int s){
       // does something else that requires x, y and q, r, s
    }
}

所以无论如何,我应该每次传递x和y(其中x,y是存储在帮助器类func中的变量)?

 a.set(x,y);
 a.doA(p,q,r);

我的想法是有一个特殊的容器类,其中x和y是保存的。顶级类将具有容器类的实例,并使用 set 方法更改 x,y。

// in the top level class:
Container c = new Container(x,y);
a.setContainer(c);
b.setContainer(c);

我的帮助程序类还将具有容器的实例,它将指向与顶层相同的实例。这样,它们就可以访问与顶层相同的 x,y。

我想知道我是否应该

  • 使用容器类
  • 每次将 x,y 加载到子类中
  • ??一些更好的方法??

答案 1

我想你的问题的答案是名为Singleton的设计模式。它基本上允许您在系统中随时获取并利用类的相同(和唯一)实例。

这是它的实现(请原谅可能的语法错误,我没有编译它):

class Container{

  //eventually provides setters and getters
  public float x;
  public float y;
  //------------

  private static Container instance = null;
  private void Container(){

  }
  public static Container getInstance(){
    if(instance==null){
       instance = new Container();
      }
      return instance;
  }
}

然后,如果在代码中的其他地方导入容器,则可以编写例如

Container.getInstance().x = 3;
temp = Container.getInstance().x;

并且您将影响系统中唯一容器实例的属性

然而,在许多情况下,最好使用依赖关系注入模式,因为它减少了不同组件之间的耦合。


答案 2

我很难看出你的问题是什么 - 为什么你不想传递x a y作为参数?

哦,好吧。假设你没有,我不认为需要一个新的容器类。这样做:

public class SubClass1a() {  // in its own separate file
    public void doA(Top_Level_Class caller, int p, int q, int r){
       // do something that requires x,y and p, q, r
       // **to get x use the expression term caller.getX() and caller.getY()**
    }
}

当然,您需要将公共 getter 方法 getX() 和 getY() 添加到Top_Level_Class。

如果您不希望 SubClass1a 依赖于Top_Level_Class则可以创建一个提供对变量的访问的接口。