アサーション
日本語 | 断言 |
英語 | assertion |
ふりがな | あさーしょん |
フリガナ | アサーション |
assertを用いてメソッドの「仕様」を決める方法。
assertは、変数をチェックし、その変数に誤りがあればAssertionErrorクラスを投げる。このAssertionErrorクラスはErrorクラスのサブクラスのため厳密には例外ではなく、catchで拾ってはならない。つまり「assertに引っかかるとプログラムが止まる」ことになる。
このassertを、引数のチェックや戻り値のチェックに使用する。
メソッドには、引数に渡していい値や、その引数に対応した戻り値等に、明確な仕様が存在する。これらの仕様を、実際にプログラム上でチェックするために使用するのがassertであり、その「チェックすること」が「アサーション」である。
アサーションはメソッドの仕様を明確にするため、「契約による設計」を実装するために使用する。
そのため、単純な入力チェックの代わりに使用したり、投げられるAssertionErrorクラスを拾ったりしてはいけない。
あくまで「プログラム上、絶対にあってはならない」事に対してチェックを行い、その「あってはならないこと」をチェックするために使用する。この「あってはならないこと」が「契約による設計」の「契約」に該当する。
逆に言うと、アサーションを使用するためにはメソッドの引数や戻り値の仕様を明確にする必要があるということであり、厳密で安全なプログラムを組むためのものである。
assertは、変数をチェックし、その変数に誤りがあればAssertionErrorクラスを投げる。このAssertionErrorクラスはErrorクラスのサブクラスのため厳密には例外ではなく、catchで拾ってはならない。つまり「assertに引っかかるとプログラムが止まる」ことになる。
このassertを、引数のチェックや戻り値のチェックに使用する。
メソッドには、引数に渡していい値や、その引数に対応した戻り値等に、明確な仕様が存在する。これらの仕様を、実際にプログラム上でチェックするために使用するのがassertであり、その「チェックすること」が「アサーション」である。
アサーションはメソッドの仕様を明確にするため、「契約による設計」を実装するために使用する。
そのため、単純な入力チェックの代わりに使用したり、投げられるAssertionErrorクラスを拾ったりしてはいけない。
あくまで「プログラム上、絶対にあってはならない」事に対してチェックを行い、その「あってはならないこと」をチェックするために使用する。この「あってはならないこと」が「契約による設計」の「契約」に該当する。
逆に言うと、アサーションを使用するためにはメソッドの引数や戻り値の仕様を明確にする必要があるということであり、厳密で安全なプログラムを組むためのものである。
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// 注:
// アサーションはJ2SEのバージョンが1.4以降である必要があります。
// また、実行時にVM引数に-eaを追加しなければアサーションは機能しません。
// Eclipseの場合、メニューの「実行」-「デバッグ」の
// 「起動構成の作成、管理、及び実行」ダイアログの「引き数」ページの
// 「VM 引き数」に-eaを追記してください。
// 一番標準的なアサーションの使用方法。
// addOne()メソッドは「引数にnullを渡してはいけない」という
// 仕様になっています。
// そのため、本来であれば、下記のstringは、nullチェックを
// 行い、nullでない場合にのみaddOne()メソッドに渡すようにします。
// assertは、そういう「関数の呼び出し元に、関数のルール(契約による設計)
// を守らせる」ために存在します。
String string = "テスト";
if( string != null )
{
String result = addOne( string );
System.out.println( result );
// テスト1
}
// assertが「契約を守らせるためにある」ため、assertから
// 投げられるAssertionErrorクラスを拾ってはいけません。
// プログラムは、必ず「assertが発生しないよう」に作る
// 必要があります。
}
/**
* assertの一番基本的な使い方。
* @param string 出力する文字列。nullは不可。
* @return 引数に"1"を足したものを返します。nullは返しません。
*/
private static String addOne( String string )
{
// assertで、引数をチェックします。
assert string != null : "引数stringがnullです。";
// このように「本来はあってはいけない値」をチェックする
// ために使用します。
// 引数に"1"をくっつけます。
String result = string + "1";
// assertでチェックします。
assert result != null : "戻り値がnullです。";
// 自分で実装するのになんでこれが必要なの? と思うかも
// しれませんが、このようにすることで、自分の実装ミスを
// 回避することができるからです。つまり、このように
// プログラムで記述することで、自分のミスを防ぐわけです。
return result;
}
}
public class Sample
{
public static void main( String[] args )
{
// 注:
// アサーションはJ2SEのバージョンが1.4以降である必要があります。
// また、実行時にVM引数に-eaを追加しなければアサーションは機能しません。
// Eclipseの場合、メニューの「実行」-「デバッグ」の
// 「起動構成の作成、管理、及び実行」ダイアログの「引き数」ページの
// 「VM 引き数」に-eaを追記してください。
// 一番標準的なアサーションの使用方法。
// addOne()メソッドは「引数にnullを渡してはいけない」という
// 仕様になっています。
// そのため、本来であれば、下記のstringは、nullチェックを
// 行い、nullでない場合にのみaddOne()メソッドに渡すようにします。
// assertは、そういう「関数の呼び出し元に、関数のルール(契約による設計)
// を守らせる」ために存在します。
String string = "テスト";
if( string != null )
{
String result = addOne( string );
System.out.println( result );
// テスト1
}
// assertが「契約を守らせるためにある」ため、assertから
// 投げられるAssertionErrorクラスを拾ってはいけません。
// プログラムは、必ず「assertが発生しないよう」に作る
// 必要があります。
}
/**
* assertの一番基本的な使い方。
* @param string 出力する文字列。nullは不可。
* @return 引数に"1"を足したものを返します。nullは返しません。
*/
private static String addOne( String string )
{
// assertで、引数をチェックします。
assert string != null : "引数stringがnullです。";
// このように「本来はあってはいけない値」をチェックする
// ために使用します。
// 引数に"1"をくっつけます。
String result = string + "1";
// assertでチェックします。
assert result != null : "戻り値がnullです。";
// 自分で実装するのになんでこれが必要なの? と思うかも
// しれませんが、このようにすることで、自分の実装ミスを
// 回避することができるからです。つまり、このように
// プログラムで記述することで、自分のミスを防ぐわけです。
return result;
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // 注: // アサーションはJ2SEのバージョンが1.4以降である必要があります。 // また、実行時にVM引数に-eaを追加しなければアサーションは機能しません。 // Eclipseの場合、メニューの「実行」-「デバッグ」の // 「起動構成の作成、管理、及び実行」ダイアログの「引き数」ページの // 「VM 引き数」に-eaを追記してください。 // 一番標準的なアサーションの使用方法。 // addOne()メソッドは「引数にnullを渡してはいけない」という // 仕様になっています。 // そのため、本来であれば、下記のstringは、nullチェックを // 行い、nullでない場合にのみaddOne()メソッドに渡すようにします。 // assertは、そういう「関数の呼び出し元に、関数のルール(契約による設計) // を守らせる」ために存在します。 String string = "テスト"; if( string != null ) { String result = addOne( string ); System.out.println( result ); // テスト1 } // assertが「契約を守らせるためにある」ため、assertから // 投げられるAssertionErrorクラスを拾ってはいけません。 // プログラムは、必ず「assertが発生しないよう」に作る // 必要があります。 } /** * assertの一番基本的な使い方。 * @param string 出力する文字列。nullは不可。 * @return 引数に"1"を足したものを返します。nullは返しません。 */ private static String addOne( String string ) { // assertで、引数をチェックします。 assert string != null : "引数stringがnullです。"; // このように「本来はあってはいけない値」をチェックする // ために使用します。 // 引数に"1"をくっつけます。 String result = string + "1"; // assertでチェックします。 assert result != null : "戻り値がnullです。"; // 自分で実装するのになんでこれが必要なの? と思うかも // しれませんが、このようにすることで、自分の実装ミスを // 回避することができるからです。つまり、このように // プログラムで記述することで、自分のミスを防ぐわけです。 return result; } }