如何使许多类都可以访问 Arraylist?

Posted

技术标签:

【中文标题】如何使许多类都可以访问 Arraylist?【英文标题】:How do I make an Arraylist accessible to many classes? 【发布时间】:2011-09-08 11:08:25 【问题描述】:

我正在制作一款垂直射击游戏,但在碰撞检测方面遇到了问题。通过 Rectangle 方法“intersect”检测碰撞,但为了跟踪可能发生碰撞的所有内容,我需要 Arraylists 来跟踪所有子弹和敌舰。 Enemy 和 Player 类都产生 Bullets(它们也有自己的类),所以我想在我的 GameView 类中有 2 个不同的 Arraylist(它控制游戏图形并希望在这里完成后发生碰撞)。

在生成时允许将子弹添加到其各自的 ArrayList 的最有效方法是什么?

子弹类:

public class Bullet extends Location
    private Fights bulletOwner;
    private int damage;
    private int velocity;

    public Bullet(Fights owner, int dmg, Rectangle loca)
    
        super(loca);
        bulletOwner = owner;
        damage = dmg;
    

    public Fights getOwner()return bulletOwner;
    public int getDamage()return damage;
    public int getVelocity()return velocity;

位置类

import java.awt.Rectangle;

public class Location 
    protected Rectangle loc;

    public Location (Rectangle location)
    
        loc = location;
    

    public Rectangle getLocation()
    
        return loc;
    

    public void updateLocation(Rectangle location)
    
        loc = location;
    

【问题讨论】:

使用多线程时要小心。数组列表的并行修改可能会导致奇怪的异常(对于 i : list.size())-> 越界,因为其他一些线程刚刚删除了一个元素并且大小已经改变。 Collections.synchronizedList 或者 CopyOnWriteArrayList 可能是更好的选择。 【参考方案1】:

就像 Marcelo 所说的,GameState 类是个好主意。我要补充一点,使 GameState 类实现单例模式将提高安全性并减少列表的容易出错的全球化。 (会将此作为对其他答案的评论,但我还不能评论,抱歉。)

另外,由于您的问题是关于生成子弹对象的效率,请查看原型和工厂模式。

【讨论】:

【参考方案2】:

您可以拥有一个包含位置数组列表的 GameState 类,并将 GameState 实例作为参数传递给 Location 派生类的构造函数。

【讨论】:

以上是关于如何使许多类都可以访问 Arraylist?的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList和Vector的区别?

ArrayList 的初始大小

多类型自定义arraylist

list 接口与实现类arraylist 区别

Java容器:ArrayList的神秘面纱

Java容器:ArrayList的神秘面纱