Java 2 SDK 開発ガイド (Solaris 編)

制御フローの不変条件

アサーションを効果的に使用できるもう一つの例は、デフォルトの case を持たない switch 文です。

たとえば :


 switch(suit) {
      case Suit.CLUBS:
        ...
        break;

      case Suit.DIAMONDS:
        ...
        break;

      case Suit.HEARTS:
        ...
        break;

      case Suit.SPADES:
        ...
    }

プログラマはおそらく、「上記 switch 文の 4 つの case のうちの 1 つが常に実行される」と仮定しています。この仮定をテストするには、次のようなデフォルトの case を追加します。


default:
        assert false;

通常は、プログラマが「本来到達すべき場所ではない」と仮定している場所ならば、次の文はどこにでも置けるはずです。


 assert false;

たとえば、次のようなメソッドがあると仮定します。


 void foo() {
        for (...) {
            if (...)
                return;
         }
         // Execution should never reach this point!!!
    }

最後のコメントを次のように変更します。


assert false;

この技法を使用するときには十分に注意してください。ある文が到達不能である場合 (JLS 14.19 を参照)、その文が到達不能であることを表明しようとすると、コンパイル時にエラーが発生します。