2

興味深い事例が 1 つあることに気付き、誰かがそれを説明できるかどうかを知りたいと思いました。これが私のケースです:

private enum Classifiers {
    NEURAL_NETWORK, NEAREST_NEIGHBOURS, IDENTITY;
}
private ClassifierInterface getClassifierInstance(Classifiers classifier) {
    switch (classifier) {
    case NEURAL_NETWORK:
        return new DoubleLayeredNeuralNetwork();
    case NEAREST_NEIGHBOURS:
        return new NearestNeighbours();
    case IDENTITY:
        return new IdentityClassifier();
    }
    return null; // If I comment out this line I get compilation error
}

コメントを参照してください。Unreachable codeこの行でエラーが報告されると思います。代わりに、Method must return valueこの行をコメントアウトするとエラーが発生します。ただし、プログラム フローがそこを通過する方法はありません。

値が渡された場合のガードケースになると思いましたが、予想どおり、これはスイッチ条件のnullトリガーです。NullPointerException

私はswitchあまり頻繁に使用しません。おそらくここで何かが欠けています。誰かがこの振る舞いを理解するのを手伝ってくれませんか?

4

2 に答える 2

4

デフォルトの case ステートメントがないため、これは正しい動作です。問題は、後で値を追加して、enumそれを使用するコードを再コンパイルできないことです。値の 1 つでない場合は常に処理するように強制することで、これがカバーされます。

ところで:classifier残念ながら、別のオプション スイッチが処理しない null の可能性があります。

于 2012-04-28T07:47:09.460 に答える
3

その質問は面白い...

このようなものがあり、コンパイラは満足しています!

public enum Coin {
     PENNY,
     NICKEL,
     DIME,
     QUARTER;
}

private enum CoinColor { COPPER, NICKEL, SILVER }
private static CoinColor color(Coin c) {
    switch(c) {
        case PENNY:
            return CoinColor.COPPER;
        case NICKEL:
            return CoinColor.NICKEL;
        case DIME: case QUARTER:
            return CoinColor.SILVER;
        default:
            throw new AssertionError("Unknown coin: " + c);
    }
}

Java言語仕様には次のように書かれています:

列挙値式のスイッチにデフォルト ラベルがなく、1 つ以上の列挙型の定数のケース ラベルがない場合、Java コンパイラは警告を提供することをお勧めします (必須ではありません)。(そのようなステートメントは、式が不足している定数の 1 つに評価される場合、黙って何もしません。)

于 2012-04-28T07:50:20.367 に答える