6

時々、プロジェクトの列挙型に新しい値を追加する必要があります。

public enum Day {
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 
   FILENOTFOUND //this one is new one
}

私が望むのは、次のように、新しい値を処理していないすべてのスイッチに対してコンパイル時エラーが発生することです。

switch (color) {
        case MONDAY: 
        case TUESDAY: 
        case WEDNESDAY: 
        case THURSDAY: 
                    System.out.println("Mondays are bad.");
                     break;

        case FRIDAY: System.out.println("Fridays are better.");
                     break;

        case SATURDAY:
        case SUNDAY: System.out.println("Weekends are best.");
                     break;
    } 

default: 例外をスローするだけでは十分ではありません。コンパイル時にしたいと思います。

これは可能ではないと思いますが、誰かが巧妙なトリックを持っているかもしれません...

Findbugs にはそれらを見つけるためのルールがあると思っていましたが、これしか見ませんでした :

編集:私はマークの返信を選択しています.私はEclipseを使用しています. 私は findbugs の専門家ではないので、そのような機能を見落としているかもしれませんが、そうは思いません。

4

3 に答える 3

8

Eclipseには、有効にできるコンパイル時の警告/エラーがあります。列挙型定数は「スイッチ」でカバーされていません。

プロジェクトのプロパティ(または一般設定)から、 [ Javaコンパイラ] -> [エラー/警告]に移動し、 [プロジェクト固有の設定を有効にする]をオンにします。警告は、潜在的なプログラミングの問題の下にあります。デフォルトでは[無視]に設定されていますが、[警告]または[エラー]に上げることができます。

編集:これは言うまでもないと思いましたが、とにかく言うと思います。これは、Eclipseで開発している場合、またはビルド管理に使用している場合にのみ適用されます。明らかに、Findbugsまたは同様の同等のものは、IDEを超越し、ビルドプロセスに統合できるため、「本当の」答えになります。

于 2010-10-22T18:52:59.083 に答える
2

これを行うには、デフォルトの句を追加し、アクセスしたときにログに記録します。

switch (color) {
default:
    log.error("Unknown color in switch: " + color);
    break

case MONDAY: /*FALLTHROUGH*/
case TUESDAY: 

(フォールスルーコメントを追加すると、後のメンテナがコードを忘れたかどうかを判断するのに役立ちます:-))

マークの回答に対するコメントからコピーされた説明を編集します。

このようなIDE機能のシグナリングケースは、変更の時点では開発者にとっては問題ありませんが、コードが依存するコードの他の部分の変更をキャッチしません。

新しいバージョンに対して再コンパイルされない限り、列挙型のスイッチを含むcientコードは変更に対して堅牢にはなりません。

クライアントコードが未処理のケースをログに記録するときに役立ちます。デプロイされたコードは、クラスパスまたはライブラリのバージョンを常に完全に制御できるとは限りません。

于 2010-10-22T18:53:00.143 に答える
0

IntelliJ は、すべてのケースが設定されていないチェックでした。欠落しているケースを埋めるための自動修正があります。

于 2010-10-22T20:39:43.983 に答える