私有静态列表,包含所有构造的对象

时间:2016-08-02 14:08:48

标签: java list oop design-patterns static

我正在编写动画程序,其中许多球都跑来跑去弹跳。

我制作了Ball类来代表球的行为。

当我用另一个球实施球的collisioin时,
我必须检查所有其他球 所以我上了这堂课。

public class Ball{

    private static final List<Ball> allBalls;
    static{
        allBalls = new ArrayList<>();
    }

    private Ball(){}

    public static Ball getNewBall(){
        Ball ball = new Ball();
        allBalls.add(ball);
        return ball;
    }

    public void collision(){
        for(Ball b : allBalls){
            //check whether b is colliding with me
            //and if colliding, change speed of me and b.
        }
    }

}

这种设计(将所有对象保存在私有静态列表中)是好还是坏?

2 个答案:

答案 0 :(得分:7)

你应该拥有一个BallManager类来处理这些东西。

public class BallManager {
    private static BallManager instance = new BallManager();
    private BallManager(){}
    public static BallManager getInstance() {
        return instance;
    }
    public List<Ball> ballsInPlay = new ArrayList<>();
    public void createBall(int x, int y) {}
    public void checkCollisions() {
        // loop ball list and check collisions
        // perform cleanup based on collisions
    }
    private void ballCleanup(){}
}

public class Ball{
    public Ball(){}
    public void collision(Ball other){}
}

注意:从静态类更改为单例。另外,通过在checkCollisions方法

之后添加()来修复编译错误

答案 1 :(得分:0)

使用枚举创建Singleton BallManager。

enum singleton最好用。

改善之前的答案。

public enum BallManager {
        INSTANCE;
        public List<Ball> ballsInPlay = new ArrayList<>();
        public void createBall(int x, int y) {}
        public void checkCollisions() {
            // loop ball list and check collisions
            // perform cleanup based on collisions
        }
        private void ballCleanup(){}
 }

 public class Ball{
    public Ball(){}
    public void collision(Ball other){}
}