所以我的游戏有问题,因为我无法弄清楚如何处理我的Explosion ArrayList,因为我需要从几个不同的地方添加元素,并且在搜索解决方案时,我想出了一个非常混乱解决方案将是:
import java.util.ArrayList;
public final class Factory {
private static ArrayList<Explosion> booms = new ArrayList<Explosion>();
public static void addBoom()
{
booms.add(new Explosion());
}
public static ArrayList<Integer> getBooms() {return booms;}
}
我知道,它看起来很糟糕,但有多糟糕?我的问题是,如果这是一个可行的解决方案,或者只是简单的愚蠢,为什么会这样。是的,即时通讯我认为它是全球性的(我猜)但它不是更糟糕的全球性或者它是什么?
答案 0 :(得分:2)
一个更优雅的解决方案是让这个类成为一个Singleton,这是一个基本上你想做的设计模式,但更优雅。
this是一篇概述如何创建单身人士的文章。
答案 1 :(得分:1)
我不会使用丑陋的全局状态(或者只是一种奇特的方式来做同样的事情),而是使用一个简单的BoomState对象来使用依赖注入模式:
class BoomState {
private final List<Explosion> booms = new ArrayList<Explosion>();
public void addBoom() {
booms.add(new Explosion());
}
public List<Explosion> getBooms() {return Collections.unmodifiableList(booms);}
}
并将其传递给任何需要它的人。
请注意,这不是线程安全的,因此如果由多个线程访问,则需要进行修改,例如使用CopyOnWriteArrayList
。
一种替代方案是使用Observer模式。你的BoomState会保留一个“实时”子弹列表并“监听”子弹状态,并在子弹状态变为EXPLODED时更新动臂列表。类似的东西:
class BoomState {
private final List<Explosion> booms = new ArrayList<Explosion>();
private final Set<Bullet> liveBullets = new HashSet<Bullet>();
// to be called by your weapon or bullet factory
public void addLiveBullet(final Bullet bullet) {
liveBullets.add(bullet);
bullet.onExplode(new Runnable() {
@Override public void run() {
addBoom();
liveBullets.remove(bullet);
}
});
}
public void addBoom() {...}
public List<Explosion> getBooms() {...}
}
你的子弹:
class Bullet {
private final List<Runnable> onExplode = ...
public void onExplode(Runnable r) { onExplode.add(r); }
public void doExplode() {
//show some colours
for (Runnable r : onExplode) r.run();
}
}
答案 2 :(得分:0)
如果要修改来自不同位置的书籍,则应使用Vector而不是ArrayList。它类似于ArrayList但同步;-) http://docs.oracle.com/javase/6/docs/api/java/util/Vector.html
答案 3 :(得分:0)
使用Singleton
模式只有一个可以在任何地方访问的实例.-
public class YourSingletonClass {
private static YourSingletonClass singleton;
private ArrayList<Explosion> booms;
private YourSingletonClass() {
booms = new ArrayList<Explosion>();
}
public static YourSingletonClass getInstance() {
if (singleton == null) {
singleton = new YourSingletonClass();
}
return singleton;
}
public void addBoom() {
booms.add(new Explosion());
}
public ArrayList<Integer> getBooms() {
return booms;
}