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

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


1 つの代替方法は、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();
    }
}
于 2013-09-30T22:40:47.853 に答える
0

ブームを別の場所から変更したい場合は、ArrayList の代わりに Vector を使用する必要があります。ArrayList に似ていますが、同期されています ;-) http://docs.oracle.com/javase/6/docs/api/java/util/Vector.html

于 2013-09-30T22:15:34.530 に答える
0

パターンを使用Singletonして、どこにでもアクセスできる状態のインスタンスを 1 つだけ作成します。

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 に答える