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拥有自己的副本,需要在某个点创建副本。