我目前正在开发一个java项目,有些东西让我感到尴尬: 我使用线程,所以我有一个名为" chicken"的线程,有一个名为" direction()"的方法,其中我给了一个X和一个Y在哪里必须去。
然后我在线程的run()方法中使用此方法。
this.direction(NX,NY);
我还有一个名为" test1"的主类,其中我开始了鸡,&我也有食物"类:
Chicken C1=new Chicken(50,750,1,true);
Chicken C2=new Chicken(750,750,2,true);
Chicken C3=new Chicken(200,50,3,true);
C1.start();
C2.start();
C3.start();
Food F1=new food(x,y);
食物的位置由玩家用他的鼠标选择。
问题是,值x和y经常变化,因为鸡必须朝向食物,并且位置只能在食物类/ test1中找到 现在,我在Test1中创建了一个全局变量,我可以随时更改它,并且我在线程鸡中使用,例如:
NX=Test1.x;
NY=Test1.y;
我不喜欢使用全局变量,还有另一种方法吗?
答案 0 :(得分:3)
不是使用全局变量,而是将Food
的实例注入每个Chicken
s'在施工时间:
Food food = new Food(x, y);
Chicken C1=new Chicken(50,750,1,true,food);
Chicken C2=new Chicken(750,750,2,true,food);
Chicken C3=new Chicken(200,50,3,true,food);
并将其存储在Chicken上的成员变量中。然后你可以使用例如this.direction(food.x, food.y)
(尽管您需要一些方法来确保所有线程都可以看到x和y的更新,例如使它们变得易变,或者提供同步的getter)。
答案 1 :(得分:0)
不应使用全局变量,而应将food类实现为单例设计模式(https://en.wikipedia.org/wiki/Singleton_pattern) 此设计模式确保您的对象仅实例化一次,您可以使用静态类方法(通常称为getInstance)检索该唯一实例。 构造函数应该是私有的,以防止您实例化以保证唯一的实例。
在第一次调用get实例(lazy)时实例化对象的示例:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
由于您正在使用线程,我建议在设置器上使用关键字synchronized
来更改食物的位置,以避免多个线程同时修改该值(如果您打算在多个线程中修改它) )。