最终类用作变量持有者

时间:2013-09-30 22:08:48

标签: java static final

所以我的游戏有问题,因为我无法弄清楚如何处理我的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 个答案:

答案 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;
    }