首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >作为变量保持器的最后类用法

作为变量保持器的最后类用法
EN

Stack Overflow用户
提问于 2013-09-30 22:08:48
回答 4查看 302关注 0票数 0

所以我的游戏有问题,因为我不知道如何处理爆炸的ArrayList,因为我需要从几个不同的地方给它添加元素,在寻找这个问题的解决方案时,我想出了一个非常麻烦的解决方案:

代码语言:javascript
运行
复制
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;}
}

我知道,看起来糟透了,但有多糟糕?我的问题是,这是一个可行的解决办法,还是纯粹是愚蠢的,为什么会如此。是的,我使它全球化(我猜),但它不是更糟糕的全球有或它是吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-30 22:40:47

我将通过一个简单的BoomState对象来使用依赖项注入模式,而不是丑陋的全局状态(或者说单例( singleton ),这只是一种花哨的方法):

代码语言:javascript
运行
复制
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将保留一个“实弹”子弹列表,并“侦听”子弹状态,并在子弹状态更改为爆炸时更新弹出列表。类似于:

代码语言:javascript
运行
复制
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() {...}
}

你的子弹:

代码语言:javascript
运行
复制
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();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-09-30 22:14:03

一个更优雅的解决方案将是使类成为Singleton,这是一种设计模式,本质上是为了实现您想做的事情,但更优雅。

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

票数 2
EN

Stack Overflow用户

发布于 2013-09-30 22:15:34

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19104741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档