この質問を投稿してその質問を読んだ後、メソッドが null を返すことになっているかどうか、またはこれがエラー状態と見なされて例外をスローする必要があるかどうかを知ることが非常に重要であることに気付きました。'null'を返すか、例外をスローするかについても、適切な議論があります。
メソッドを作成していて、null を返すか、例外をスローするかは既にわかっています。私の決定を表現する、つまり契約を文書化する最善の方法は何ですか?
私が考えることができるいくつかの方法:
- 仕様/ドキュメントに書き留めてください(誰かがそれを読みますか?)
- メソッド名の一部にします(ここで提案したように)
- 例外をスローするすべてのメソッドが null を返すことはなく、スローを「しない」すべてのメソッドが null を返す可能性があると想定します。
私は主に Java について話していますが、他の言語にも当てはまるかもしれません: 例外がスローされるかどうかを表す正式な方法 (throws
キーワード) があるのに、null が返される可能性があるかどうかを表す正式な方法がないのはなぜですか?
なぜそのようなものがないのですか:
public notnull Object methodWhichCannotReturnNull(int i) throws Exception
{
return null; // this would lead to a compiler error!
}
まとめと結論
契約を表現する方法はたくさんあります。
- IDE が (IntelliJ として) サポートしている場合は、 のような注釈を使用することをお勧めします。
@NotNull
これは、プログラマーに表示され、コンパイル時の自動チェックに使用できるためです。これらのサポートを追加するEclipse 用のプラグインがありますが、私にはうまくいきませんでした。 - これらがオプションでない場合は、
Option<T>
またはNotNull<T>
のようなカスタム タイプを使用して、明確さと少なくともランタイム チェックを追加します。 - いずれにせよ、JavaDoc でコントラクトを文書化することは決して悪いことではなく、時には役立つこともあります。
- メソッド名を使用して戻り値のnull可能性を文書化することは、私以外の誰も提案していません。非常に冗長で常に役立つとは限りませんが、それでも利点がある場合があると私は信じています。