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

IntelliJ 有@NotNull 和 @Nullable 注释。它使用 IDE 中的静态检查和字节码检测在运行时执行检查。您还可以检测运行时检查。

于 2011-06-21T15:12:38.990 回答
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>(可变)。这些不一定完全是您正在寻找的,因为它们都被允许“不存在”(不持有任何价值),但它们都不可能包含null. Holder特别是它似乎适用于您示例中的场景,因为您没有显示它被初始化为任何值(它String在创建时没有给出任何值,因此它最初必须不存在)。如果给定,它的set方法会抛出,就像你想要的那样。NullPointerExceptionnull

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

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

使用Holderor时,您通常应该在调用之前Optional检查它,因为如果不存在它会抛出。或者,您可以使用以下方法:isPresent()get()IllegalStateExceptionor

String definitelyNotNull = stringHolder.or("default");
于 2011-06-21T15:08:28.120 回答
-4

关于什么:

NonNullable<?>

于 2011-06-21T15:08:43.793 回答