2016-10-19 9 views
1

enumを考えてみましょう。Java Enumメソッド - スイッチと各オブジェクトのオーバーライド

各オブジェクト に対して "switch(this)"を使用して1つのメソッドを作成し、1つの抽象メソッドを作成してenumの各オブジェクトに対してオーバーライドする方法との違いは何ですか?

+1

あなたの気持ちを少し詳しく説明するコードを投稿することができます.... –

+1

[質問しない質問の種類](https://stackoverflow.com/help/dont)の[ヘルプ]をお読みください。 -ask)。ここでは、基本的に、実際の問題を解決することなく、プロと詐欺師の皆さんの意見を求めています。 –

答えて

1

スイッチを使用すると、コードを共有することができます。同じコードに対して複数のケースラベルを組み合わせることができます。

すべての列挙型が異なる場合(またはほとんどの場合)、オーバーライドを使用します。

注:デフォルト実装を使用して、異なる実装を上書きすることができます。

2

列挙型を変更していない場合でも必ずしも違いはありません。しかし、例を見てみましょう:

enum MyEnum { 
    FIRST 
    { 
     @Override 
     void foo() { 
      //Do something 
     } 
    }, 
    SECOND 
    { 
     @Override 
     void foo() { 
      //Do something else 
     } 
    }; 

    abstract void foo(); 
} 

を今、私たちはこの列挙に新しい要素THIRDを追加した場合、コンパイラは、私たちが実際にこのメソッドを実装していることを確認します。

のではなく、スイッチケースを見てみましょう:私たちは新しい要素THIRDを追加しました

enum MyEnum { 
    FIRST, 
    SECOND; 

    void foo() { 
     switch (this) { 
     case FIRST: 
      //Do something 
      break; 
     case SECOND: 
      //Do something else 
      break; 
     default: 
      break; 
     } 
    } 
} 

場合は、我々は我々がする必要がある意味、switch文に追加のケースを追加し忘れることができるだろうより慎重。

もう1つの違いは、単純にswitchをこれらの列挙型オブジェクトの外部機能に使用できますが、列挙型自体に追加のメソッドを追加することはできません。

0

enumメソッドは、Open/Closedの原理に従うという利点があります。列挙型を拡張する必要がある場合は、新しい列挙型メンバー用のメソッドを実装するだけで済みます。そうでなければ、あなたのenumがすべての可能性をカバーするためにどこにコードを見つけるのか調べなければなりません。

あなたがそれについて厳格すぎると、あなたのコードにあまりにも多くのものを置く可能性があるということです。あなたのビジネスレベルで年齢範囲をカバーする列挙型があり、UIレベルで、ユーザーの年齢に基づいて異なるレイアウトを提示したいと想像してください...明らかに、HTMLの詳細を指定する列挙型にメソッドを追加すると、多くの抽象レベル。

私は列挙型の "コア"関数に関連し、スイッチを他の場所で使用する問題に対しては、enumメソッドを使用する傾向があります。

関連する問題