2

アリーナ ゲームの場合、考えられるゲームタイプの列挙があります。これらのゲームタイプのそれぞれには、イベントをリッスンして構成値を処理する列挙型ごとに 2 つのクラスが関連付けられたバリアントのリストがあります。現在、列挙型からこれらのリスナーと構成ローダーを構築しています。その際、switch ステートメントを使用する必要があります。次のメソッドは、列挙値からリスナーを取得します。

public GameListener getListener(CustomGame cg) {
    switch(this) {
    case Slayer:
        return new SlayerListener(cg);
    case Capture_The_Flag:
        return new CaptureTheFlagListener(cg);
    case Oddball:
        return new OddballListener(cg);
    case HeadHunter:
        return new HeadHunterListener(cg);
    case King_Of_The_Hill:
        return new KOTHListener(cg);
    default:
        return null;
    }
}

構成にも同様のコードが存在します。抽象メソッドを使用して switch ステートメントを削除できることは知っていますが、もっと簡単な方法があるかどうか疑問に思っていました。列挙型に 2 つの型パラメーターを使用させようとしましたが、それを機能させることができず、それらを使用して構築することもできませんでした。1 つのオプションは、 を渡し、Class<T>リフレクションを介してオブジェクトを構築することです。

このクラスには、列挙ごとに非常に異なるレイアウトを持つ別のメソッドがあり、そのための最良のオプションは抽象メソッドになると思いますが、ここにはもっと簡単な解決策があるように感じます。

4

3 に答える 3

4

これはもう少し冗長ですが、列挙型に直接ファクトリ メソッドを提供できます。

public enum GameType {
  SLAYER {
    @Override
    public GameListener getListener(CustomGame cg)
      return new SlayerListener(cg);
    }
  },
  // ... similarly for other GameListener types

  public abstract GameListener getListener(CustomGame cg);
}

このソリューションの良い点は、メソッドGameTypeの実装を定義せずに新しいを作成することが不可能になったことです。getListener()

于 2013-10-28T20:41:46.907 に答える
1

これはファクトリ メソッドです。このシナリオでスイッチを使用することは完全に有効だと思います。別の方法は、リスナーの継承階層を作成し、リスナーの (おそらく抽象的な) スーパークラスへの参照を宣言し、実行時に参照用の正しいリスナーをインスタンス化することです。面倒かもしれませんが、よりオブジェクト指向です。これは、多くのクラスを必要とする優れた OO 設計と、switch ステートメントでいっぱいのコードとの間のトレードオフです。

于 2013-10-28T20:33:51.240 に答える
0

パフォーマンスが問題にならない場合は、次のような一般的な GameListener Getter を使用できます。

public Listener getListener( CustomGame cg ) {
    // implement some smart way to find your listener implementation here...
    Class<? extends Listener> clzz = Class.forName( this.getClass().getPackage() + "." + name() );
    Listener ret = clzz.newInstance();
    ret.setCustomGame(cg);
    return ret;
}

これには、列挙型のメンテナンスや特別なパラメーターは必要ありません。しかしもちろん、列挙名を作成されたクラス名に直接リンクするため、これは望ましい制約ではない可能性があります。

于 2013-10-28T20:59:14.520 に答える