2016-08-02 3 views
1

私は、多くのボールが走り回っていて、バウンスしているアニメーションプログラムを書いています。すべてのオブジェクトが含まれているプラ​​イベート静的リスト

ボールの動作を表すBallクラスを作成しました。

別のボールでボールのコリシンを実装すると、
他のすべてのボールをチェックする必要があります。
私はこのクラスを作った。

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. 
     } 
    } 

} 

このようなデザイン(プライベート静的リストのすべてのオブジェクトを保持する)は良いか悪いですか?

+0

「getNewBall」は**ファクトリメソッド**と呼ばれ、静的でなければなりません。しかし、それは素晴らしいデザインです。既に答えられているように、別の**ファクトリクラス**は静的でなく、ファクトリインスタンスが1つしかないという利点があります。 –

+0

@JoopEggenありがとうございます。私の「プライベート静的リストとプライベートコンストラクタ」デザインの欠点をより詳細に説明できますか? –

+1

ボールがある赤い部屋とボールがある青い部屋があるとします。それから、あなたは運がありません。ユニットテストの場合も同様です。もちろん、グローバル変数であり、クラスを使用するとすぐに初期化されます。これとは対照的に、BallFactory(またはBallManager、BallRoom、またはBalls)は、意図的に、静的に、またはそれ以上で作成することができるため、より自由です。 –

答えて

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メソッドの後に()を追加してコンパイルエラーを修正しました。

+2

おそらく、マネージャーに「静的」なものがすべて必要なわけではないことに注意してください。 –

+0

BallManagerはシングルトンにすることができます。このデザインパターンの名前はありますか? – JavaHopper

+0

ええ、シングルトンがおそらく最高です。 – markbernard

0

enumを使用して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){} 
} 
関連する問題