4

のような注釈の問題@NotNull/@NonNullは、実行時に強制されないことです。私は次のようなことをしたいです:

class Foo {
  String nullable_string;
  final NonNullable<String> nn_string = new NonNullable<String>();
  ...
  public void mutate(String arg) {
    mutable_string = arg;  // arg could be null
    nn_string.set(arg);    // throws NullPointerException for me if arg is null.
  }
  ...
}

標準のNonNullable<T>ジェネリックはどこかに存在しますか?存在しない場合、それが悪い考えである理由はありますか?

4

4 に答える 4

2

私はそれが存在しないことを確信しています。ただし、独自のものを構築できます。

public class NonNullable<T> {

    private T element;

    public void set(T element) {
        if (element == null)
            throw new NullPointerException("Parameter was null!");
        else
            this.element = element;
    }

}
于 2011-06-21T15:08:25.277 に答える
0

そのために特別なラッパー クラスを使用する必要はありません。何かを許可したくない場合は、小切手で渡された瞬間でnullはないことを確認してください。null標準 Java でこれを行うことができます。

if (arg == null)
  throw new NullPointerException();
this.string = arg;

またはGuavaを使用すると、Preconditionsクラスを使用して次のように簡略化できます。

this.string = checkNotNull(arg); // using static import

Guava の r10 では、かなり前に登場し、 Optional<T> (不変) またはHolder<T> (可変)を使用することもできます。これらは、どちらも「不在」(値を保持しない) であることが許可されているため、必ずしも探しているものとは異なりますが、どちらも含まれていない可能性がありますnullHolder特に、値で初期化されていることを示していないため、例のシナリオで機能するようです(String作成時に指定されていないため、最初は存在しない必要があります)。そのメソッドは、必要に応じて if givenをsetスローします。NullPointerExceptionnull

final Holder<String> stringHolder = Holder.absent(); // nothing at first

public void mutate(String arg) {
  stringHolder.set(arg);
}

Holderまたはを使用する場合、存在しない場合はスローされるため、通常、呼び出す前にそれをOptional確認する必要があります。または、次の方法を使用できます。isPresent()get()IllegalStateExceptionor

String definitelyNotNull = stringHolder.or("default");
于 2011-06-21T15:08:28.120 に答える
0

IntelliJ には@NotNull および @Nullable アノテーションがあります。IDE の静的チェックとバイトコード インストルメンテーションを使用して、実行時にチェックを実行します。ランタイム チェックも計測できます。

于 2011-06-21T15:12:38.990 に答える
-4

どうですか:

NonNullable<?>

于 2011-06-21T15:08:43.793 に答える