当前位置: 首页 > 面试题库 >

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

微生阳平
2023-03-14
问题内容

在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加载到子类中
  • ?? 一些更好的方法

问题答案:

我想您问题的答案是称为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;

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

但是,在许多情况下,最好使用“依赖注入”模式,因为它可以减少不同组件之间的耦合。



 类似资料:
  • 问题内容: 我需要不同的类加载器才能卸载类。但是我需要在它们之间共享对象(实际上我正在获得ClassCastException)。那么解决该问题的解决方案是什么?谢谢 问题答案: 来自不同类加载器的对象可以通过公共类加载器加载的接口和类彼此交互。

  • 我需要使用BEHAT在不同类的步骤之间共享数据。类似于(在cucumber-jvm步骤之间传递变量的良好实践)PicoContainer for cucumber。有这样的框架吗?我知道我可以使用静态成员,但可能是一些框架。

  • 调用第三方接口获取的用户信息。我想保存下来。然后再提供个查询用户信息的接口。 然后我再获取的时候赋值。 userInfo.setUserInfo(userinfo); 然后再提供个get接口 看着好像没问题。set的时候能打印到值。get的时候就没了。

  • 我要的是这种行为: 当然,当我打印时真正发生的是: 显然,它们在类中共享数据。我如何获得单独的实例来实现我想要的行为?

  • 问题内容: 我想要的是这种行为: 当然,当我打印时真正发生的是: 显然,他们在课堂上共享数据a。如何获得单独的实例以实现所需的行为? 问题答案: 在类声明中声明变量会使它们成为”class”成员,而不是实例成员。在方法中声明它们可以确保在对象的每个新实例旁边创建一个新的成员实例。

  • 问题内容: 我有以下问题。我编写了一个函数,该函数将列表作为输入并为列表中的每个元素创建一个字典。然后,我想将此字典追加到新列表中,以便获得字典列表。我正在尝试为此生成多个进程。我在这里的问题是,我希望不同的进程访问字典列表,因为它由其他进程更新,例如,一旦达到一定长度,就打印一些东西。 我的例子是这样的: 现在我的问题是每个过程都创建自己的过程。有没有一种方法可以在进程之间共享列表,以便所有字典