この目標を達成する典型的な方法は次のとおりです。メソッド入力パラメータに検証制約を配置するにはどうすればよいですか?
public void myContractualMethod(final String x, final Set<String> y) {
if ((x == null) || (x.isEmpty())) {
throw new IllegalArgumentException("x cannot be null or empty");
}
if (y == null) {
throw new IllegalArgumentException("y cannot be null");
}
// Now I can actually start writing purposeful
// code to accomplish the goal of this method
このソリューションは醜いと思います。あなたのメソッドは、有効な入力パラメータの契約をチェックする定型コードですみやかに満たされ、メソッドの中心を不明瞭にします。
これは私が持っているものです:
public void myContractualMethod(@NotNull @NotEmpty final String x, @NotNull final Set<String> y) {
// Now I have a clean method body that isn't obscured by
// contract checking
これらの注釈はJSR 303/Bean Validation Specのように見えますが、私はそれらを借用しています。残念ながら、彼らはこのように動作していないようです。インスタンス変数に注釈をつけ、バリデーターを通してオブジェクトを実行することを意図しています。
many Java design-by-contract frameworksのどれが私の「好き」の例に最も近い機能を提供していますか?スローされる例外は、(IllegalArgumentExceptionsのような)実行時例外でなければならないので、カプセル化は壊れません。
前提条件.checkArgument(!x.isEmpty())。 –
ああ、いつもライブラリ作成者を手元に持っていると便利です:) –