ためになるホームページ お問い合わせ




TOP > Java > アサーション
アサーションの概要
アサーションを利用すれば開発用の仮説をテストする事ができる。プログラムを配備する時は、アサーションコードは実質的に蒸発するので、デバックコードを探して取り除かなくてもオーバーヘッドは残らない。
アサーションはtrueのみを調べ、trueの時は以下のコードが実行され、falseの時は「AssertionError」が投げられる。※このエラーを例外ハンドラで処理してはいけない。

アサーションの書き方
  • assert(ブール式) ;
  • assert(ブール式) : "例外が投げられた時に出力するコード" ;
  • ※アサーションに関する「式」とはブール式の事である。

    アサーションを有効にする
    アサーション式が含まれているソースコードをコンパイルする。
    アサーション対応のソースコードをコンパイルするには、1.4以降が必要。
    コンパイル:javac -source 1.4 Test.java
    assertを識別子として使いたいなら、バージョンを1.3にする。

    アサーション式が含まれているソースコードを実行する。
    java -ea Testもしくは、java -enableassertions Test
    実行時にアサーションを無効にするには、以下のように実行する。
    java -da Testもしくは、java -disableassertions Test

    アサーションの実行のまとめ
    コマンド例 説明
    java -ea
    java -enableassertions
    アサーションを有効にする
    java -da
    java -disableassertions
    アサーションを無効にする
    java -ea:com.foo.Bar com.foo.Barクラスのアサーションを有効にする
    java -ea:com.foo... com.fooパッケージとその全てのサブパッケージのアサーションを有効にする
    java -ea -dsa 全体のアサーションを有効にし、システムクラスのアサーションだけを無効にする
    java -ea da:com.foo... 全体のアサーションを有効にし、com.fooパッケージとその全てのサブクラスパッケージのアサーションを無効にする。

    アサーションの例
    class Test{
        public static void main(String[] args){
            int a = 1 ;
            assert (a < 0): "a < 0" ;
        }
    }
    
    

    アサーション適切な使い方
  • パブリックメソッドの引数の検証にはアサーションは使わない。
  • プライベートメソッドの引数の検証にはアサーションを使う
  • 副作用があるようなアサーションは使わない
  • コマンドラインの引数にはアサーションを使わない。
  • パブリックメソッドでも、絶対に起こらないとわっかている状況をチェックする場合はアサーションを使う。
  • パブリックメソッドの引数を検証する際は通常、例外を使用する。例えば受け取った引数が無効の場合は「IllegaArgumentException」を投げる。

  • アサーションの不適切な例1
    class Test{
        public static void main(String[] args){
            Test t = new Test() ;
            t.dostuff(-3) ;
        }
        public void dostuff(int x){
            assert (x > 0) ;
        }
    }
    
    

    アサーションの不適切な例2
    class Test2{
        int a ;
        public static void main(String[] args){
            Test t = new Test() ;
            t.a = -3 ;
            assert(t.assertTest(t.a)) ;
        }
        private boolean assertTest(int x){
            if(x < 0){
                return true ;
            }else{
                return false ;
            }
        }
    }
    
    

    アサーションの適切な例1
    class Test{
        public static void main(String[] args){
            Test t = new Test() ;
            t.dostuff(-3) ;
        }
        private void dostuff(int x){
            assert (x > 0) ;
        }
    }
    
    

    アサーションの適切な例2
    class Test{
        public static void main(String[] args){
            Test t = new Test() ;
            t.switchTest(5) ;
        }
        public void switchTest(int x){
            switch(x) {
                case 2 : System.out.println("ok") ;
                default : assert false ;
            }
        }
    }
    
    






    Copyright 2007 ためになるホームページ All Rights Reserved.