0

所以我的游戏有问题,因为我不知道如何处理我的 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;}
}

我知道,它看起来很糟糕,但它有多糟糕?我的问题是,这是否是一个可行的解决方案,或者仅仅是愚蠢的,为什么会这样。是的,我让它成为全球性的(我猜),但它不是更糟糕的全球性存在还是它?

4

4 回答 4

2

更优雅的解决方案是将类设为 Singleton,这是一种设计模式,基本上可以做你想做的事,但更优雅。

是一篇概述如何创建单例的文章。

于 2013-09-30T22:14:03.653 回答
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.


一种替代方法是使用观察者模式。您的 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();
    }
}
于 2013-09-30T22:40:47.853 回答
0

如果你想从不同的地方修改动臂,你应该使用 Vector 而不是 ArrayList。它类似于 ArrayList 但同步 ;-) http://docs.oracle.com/javase/6/docs/api/java/util/Vector.html

于 2013-09-30T22:15:34.530 回答
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;
    }
于 2013-09-30T22:16:43.717 回答