私が見てきたこの質問をしかしの使用について詳しくはいくつか質問していassert
たキーワードを。私は、使用についてのいくつかの他のプログラマーで議論されましたassert
。このユースケースについては、一定の前提条件が満たされている場合はnullを返すことができる方法がありました。コードは、私はそれがnullを返さない主張する、と返されたオブジェクトを使用し続け、メソッドの呼び出しを書きました。
例:
class CustomObject {
private Object object;
@Nullable
public Object getObject() {
return (object == null) ? generateObject() : object;
}
}
今、私はこのようにそれを使用想像:
public void useObject(CustomObject customObject) {
object = customObject.getObject();
assert object != null;
// Do stuff using object, which would throw a NPE if object is null.
}
私は、私は削除してくださいと言われたassert
、彼らがすべきことを、決して唯一の試験に使用することが、生産コードで使用しないこと。本当?
使用しObjects.requireNonNull(Object)
ているため。
指定されたオブジェクト参照がnullでないことをチェックします。このメソッドは、主にメソッドとコンストラクタのパラメータの検証を行うために設計されています[...]
あなたのケースでは、これは次のようになります。
public void useObject(CustomObject customObject) {
object = customObject.getObject();
Objects.requireNonNull(object);
// Do stuff using object, which would throw a NPE if object is null.
}
この関数は、すなわち、明示的にnullにすることはないものをマークし、あなたが言及した目的のために作られています。また、生産インチ 大きな利点は、あなたがあなたが、彼らは最初の場所で発生しません右ヌル値を見つける作るということです。あなたはあまりトラブル彼らはすべきではないどこかに渡されたヌル値に起因する問題をデバッグする必要があります。
もう一つの利点は、とは対照的に、ヌル・チェックに関する追加の柔軟性ですassert
。ながら、assert
ブール値をチェックするためのキーワードであり、Objects.requireNonNull(Object)
関数であり、したがって、はるかに柔軟で読み取り可能なコードに埋め込むことができます。例えば:
Foo foo = Objects.requireNonNull(service.fetchFoo());
// You cannot write it in on line.
Bar bar = service.fetchBar();
assert bar != null;
service.foo(Objects.requireNonNull(service.getBar()));
// You cannot write it in on line.
Bar bar = service.getBar();
assert bar != null;
service.foo(bar);
覚えておいてくださいObjects.requireNonNull(Object)
ヌルチェックのためだけにあるassert
一般化されます。assert
すなわち、主にテストし、その点で、わずかに異なる目的を持っています。それはあなたがテストのためにそれを有効にして、生産のためにそれを無効にすることができますので、有効にする必要があります。とにかく、生産コードのためにそれを使用しないでください。これは、テストのために意図されている不要なと複雑な検証を使用してアプリケーションを遅くすることができます。同様に生産のために意図されているチェックから別々のテストのみのチェックにそれを使用してください。
公式のチェックアウトドキュメントの詳細については、をassert
。