Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的全局对象?_Java - Fatal编程技术网

Java中的全局对象?

Java中的全局对象?,java,Java,我有两门课: public class A{ int money; ArrayList<Item> boughtItems; . . public void addBoughtItem(Item item){ . . } public void adjustMoney(int adjustAmount){ money = money + adjustamount; } } 另一类: public c

我有两门课:

public class A{
   int money;
   ArrayList<Item> boughtItems;
   .
   .
   public void addBoughtItem(Item item){
      .
      .
   }
   public void adjustMoney(int adjustAmount){
      money = money + adjustamount;
   }
}
另一类:

public class B{
  ArrayList<Item> itemsForSale;
  .
  .
  public Item sellMeItem(Item item){
    .
    .
    return itemsForSale.get(...);
  }
}
现在,我主要启动一个类A的实例和一个类B的实例。 在B类中,每当我向他们出售物品时,我都希望实时更新purchasedItems并调整A类实例的货币,这意味着,在B类的sellMeItem函数中。 因此,我认为我需要一个全局的实例。 如何从class B sellMeItem函数内部访问主对象A?而B类实例也是主要的

因此,我认为我需要一个全局的实例

不太可能,您可以简单地将对a实例的引用传递给B,例如通过构造函数:

class B {

    private A a;

    public B(A a) {
        this.a = a;
    }
}
然后,您可以访问B中的a和主目录中的a:

A a = new A();
B b = new B(a);

然而,这两个类如此密切相关的事实可能意味着,在它们之间分配责任的方式不是最佳的。

最好在此处应用。让A订阅到B上的事件,您可以在main方法中连接它

为此,您可能需要为B上的观察者定义一个接口

public interface BObserver {

    void itemSold(Item item);

}

并有一个实现这个接口的程序。通过这种方式,不同类型的多个观察者可以注册到B。

通过setter方法或通过B的构造函数将A的实例传递到B中。将ref存储为实例变量。如果您将类命名为比A和B更具描述性的名称,这将非常有用。至于globals,当我在Java程序上工作时,我从来没有过多考虑global。如果你这样做了,你可能会认为这是一种代码气味,这意味着你走错了方向。不过,您可能需要的是一种称为单例模式的模式@Marvo A singleton几乎从来都不是解决全局变量需求的解决方案-重构是…因此在我的评论中使用了MAY这个词。但是当我从类B中的SellMeItem函数内部更新A实例时,它会更新主函数中的同一个A实例吗?或者它会复制对象并拥有自己的框架?我喜欢最后一点。可能将A和B分解为轻量级bean,并使用第三个类来管理业务逻辑。我严格遵守导师的命令,无法将它们拆分为两个bean并放入第三个类中。@user1656647对象不会在分配时复制。您分配的是对对象的引用。当您将a的实例传递给B时,实际上您只是将对a的引用传递给B。要使B拥有自己的副本,需要在某个点创建副本。