所以我的游戏有问题,因为我不知道如何处理爆炸的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;}
}我知道,看起来糟透了,但有多糟糕?我的问题是,这是一个可行的解决办法,还是纯粹是愚蠢的,为什么会如此。是的,我使它全球化(我猜),但它不是更糟糕的全球有或它是吗?
发布于 2013-09-30 22:40:47
我将通过一个简单的BoomState对象来使用依赖项注入模式,而不是丑陋的全局状态(或者说单例( singleton ),这只是一种花哨的方法):
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。
另一种选择是使用观察者模式。您的BoomState将保留一个“实弹”子弹列表,并“侦听”子弹状态,并在子弹状态更改为爆炸时更新弹出列表。类似于:
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();
}
}发布于 2013-09-30 22:14:03
一个更优雅的解决方案将是使类成为Singleton,这是一种设计模式,本质上是为了实现您想做的事情,但更优雅。
这是一篇概述如何创建单例的文章。
发布于 2013-09-30 22:15:34
如果您想要从不同的地方修改繁荣,您应该使用向量而不是ArrayList。它类似于ArrayList,但同步;-) http://docs.oracle.com/javase/6/docs/api/java/util/Vector.html
https://stackoverflow.com/questions/19104741
复制相似问题