回答:
気をつけて!
アサーションは、コードのコンパイル時に「アサーションを有効にする」ことを明示的に指定しない限り、実行時に削除されます。Javaアサーションはプロダクションコードでは使用されず、プライベートメソッドに限定する必要があります(例外とアサーションを参照)。プライベートメソッドは開発者のみが知っており、使用することが期待されています。また、not を拡張するAssertionErrorをassert
スローします。これは通常、非常に異常なエラー(回復が困難な「OutOfMemoryError」など)があることを示しますが、処理できないことが予想されます。Error
Exception
「アサーションを有効にする」フラグを削除し、デバッガーで確認すると、IllegalArgumentException throw callを踏まないことがわかります。このコードはコンパイルされていないため(「ea」が削除されると)
public / protectedメソッドには2番目の構成を使用することをお勧めします。1行のコードで何かをしたい場合は、少なくとも1つの方法を知っています。私は個人的に、引数をチェックするためのいくつかのメソッドを持ち、失敗したときに "IllegalArgumentException"をスローするSpring FrameworkのAssert
クラスを使用しています。基本的に、あなたがすることは:
Assert.notNull(obj, "object was null");
...実際、2番目の例で記述したコードとまったく同じコードを実行します。以下のようないくつかの他の有用な方法がありhasText
、hasLength
そこに。
必要以上のコードを書くのは好きではないので、書き込まれた行の数を2つ減らすとうれしいです(2行> 1行):-)
java -ea
、プログラムで有効にできます。@Jalayn私は、彼らがために有用である生産コードでアサーションを持つことが、完全に有効であると考える分野でのデバッグ
java -ea
。
Objects.requreNonNull
例外を使用する必要があります。アサーションを使用すると、機能の誤用になります。
未確認の例外はライブラリのユーザーのプログラミングエラーを検出するように設計されており、アサーションは独自のロジックのエラーを検出するように設計されています。これらは混在してはならない個別の問題です。
たとえば、アサーション
assert myConnection.isConnected();
は、「このアサーションに至る各コードパスが確実にmyConnection
接続されることを知っています。上記のコードが有効な接続を取得できなかった場合、このポイントに到達する前に例外を返すか戻る必要があります。」
一方、チェック
if (!myConnection.isConnected()) {
throw new IllegalArgumentException("connection is not established");
}
「接続を確立せずにライブラリを呼び出すと、プログラミングエラーになる」ことを意味します。
null
有効なパラメーター値として許可されない関数を作成している場合は、@Nonnull
注釈に署名を追加しObjects.requireNonNull
、引数が存在するかどうかを確認し、存在する場合はnull
スローするNullPointerException
必要があります。@Nonnull
注釈は文書化のためのものであり、いくつかのケースでは、コンパイル時に役立つ警告を提供します。null
実行時に渡されることを妨げません。
void doStuff(@Nonnull Object obj) {
Objects.requireNonNull(obj, "obj must not be null");
// do stuff...
}
アップデート:@Nonnull
注釈はJavaの標準ライブラリの一部ではありません。代わりに、サードパーティのライブラリから多数の競合する標準があります(どの@NotNull Javaアノテーションを使用すべきかを参照してください)。それは、それが標準ではないというだけで、それを使用するのが悪い考えであることを意味しません。
Objects.requireNonNull()
、これは私にとっては新しいことでした。同様の「requireTrue()」または「requireEqual()」メソッドがどこにあるか知っていますか?SpringのAssertに対しては何もありませんが、誰もがそれを使用しているわけではありません。
Objects.requireNonNull()
は引数の検証用です。引数がtrue
何かである必要がある場合、その引数は無意味です。不正な引数以外のエラーの場合、エラーをより正確に記述する必要がthrow
ありException
ます。JUnitもありますAssert
が、これはテスト用です。
Objects.requireTrue(x >= 0.0);
、またはハッシュについてObjects.requireEquals(hash.length == 256)
私は常にアサーションよりもIllegalArgumentExceptionをスローすることを好みます。
アサーションは、テスト結果を確認/アサートするために、主にJUnitまたは他のテストツールで使用されます。そのため、メソッドがテストメソッドであるという誤った印象を他の開発者に与える場合があります。
また、メソッドに不正または不適切な引数が渡されたときにIllegalArgumentExceptionをスローすることは理にかなっています。これは、Java開発者が従う例外処理規則とより一貫しています。
アサートはあまり使用しませんが、Lombock @NonNullでの一般的なアプローチ:https ://projectlombok.org/features/NonNull
ロンボクの実装:import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
Javaバージョン:
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person");
}
this.name = person.getName();
}
}
ロンボクは私がいたるところで使っている本当に素晴らしいライブラリです
obj.hashCode()
代わりにシンプルな方が好きです;-)