2016-09-15 5 views
-1

以下の例では、Enumはクラスが処理する処理量を示します。処理ロジックを使用してenumを実装するとよいですか?

enum TriggerHandlerType { 
    DASHBOARD { 
     @Override 
     TriggerHandler create() { 
      return new DashboardTriggerHandler(); 
     } 
    }, 
    COMPONENT_HANDLER { 
     //... 
    }; 

    abstract TriggerHandler create(); 
} 

private static TriggerContext getTriggerContext(TriggerHandlerType triggerHandlerType) throws TriggerHandlerException { 
    return new TriggerContext(triggerHandlerType.create()); 
} 

列挙型は、通常、この場合のように、それらが処理ロジックに基づいて変化する値を返すされる定数のタイプ安全な保管のために使用されます。ある意味では、Enumはここでクラスの処理を容易にする状態判定を行うため、包括的な技術と思われます。また、戻り値は有限値のサブセットであるため、Enum自体によって処理が処理されるように思えます。これはSOLID開閉原則を破るだろうとクラスは誰もがこの上で自分の考えを共有することができ、より多くの列挙型が追加されますいつでもコードの行の増分を持つことになりますどこ

私はここでの問題を見ていますか?

+1

文脈によっては、この場合はひどい考えです。 –

+0

@ DavidPrezCabreraコメントをいただきありがとうございます。Githubのこのコードを見て、別の具体的なクラスやスイッチのケースやハッシュマップを持つよりも実装が簡単になると思っていました。任意の特定の理由 –

+0

@RealSceptive私は同意する!、私はgithubから取った、私はそれを削除し、ちょうど今見てみることを望むを見てください –

答えて

0

ているので、私は、OR、AND、SEQなどのような、やって操作として列挙型を持っていました。

Java 8とただ1つのオーバーライドメソッドを使用すると、機能インタフェースをパラメータとして持つコンストラクタを作成することもできます。

enum TriggerHandlerType { 
    DASHBOARD(() -> DashboardTriggerHandler::new)), 
    COMPONENT_HANDLER (() -> { ... }); 

    private final Fun fun; 

    private TriggerHandlerType(Fun fun) { 
     this.fun = fun; 
    } 

    public TriggerHandler create() { 
     fun.apply(); 
    } 
} 

は、他のケースでは、私はクラスを分離するために、この技術を使用して、クラスの明確な階層を持っていませんでした。 enumは、後のクラスをまだ使用していない初期のクラスでした。

enumからハンドラへのマップも同様です。ユニットテストでは、作成されたマップのサイズが列挙型の値と等しいかどうかを確認することができます。

私はenumが人工カップリングであると言う必要はありません。要素の数が固定されているかどうかは、クラス/シングルトンを別々にすることができます

です。

0

本当の答えは:あなたは、いくつかの機能は常にシンタックスシュガーとして、あなたのAPIクライアントによって実装されない列挙型を定義することができますどのような列挙型が..

に定義されている依存...

の良い例それは、すべて一定の時間を計算するために使用することができ、最終的なクラスは

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html#toHours(long)

他の列挙は、コンパレータインタフェースを実装し、実装に変換されるJava TimerUnitありますその定数はすでに定義されたソートのcriterias ..

それらのすべてが有効ではsintax砂糖

関連する問題