gpt4 book ai didi

java - JSR-308 : Clarification on Nonnull, ParameterAreNonnullByDefault 以及 Eclipse Kepler 检测它的方式

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:25:42 25 4
gpt4 key购买 nike

我决定编辑我的问题,在看到 1 年后,我改变了我处理空值的方式:

  • 我不使用 Eclipse 内置的空检查,因为我发现它相当原始(并且可能有点难以理解)
  • 我使用 @Nullable 来告诉一个值可以为空。毕竟,空值应该少于非空值。
  • 我使用的是 Java 8,我倾向于使用 Optional,因此允许以下操作:Optional.ofNullable(value).orElseGet(() -> 1);。它没有击败 Groovy 的 ?:?. 运算符,但是 Optional 提供了一些不错的工具,如 mapfilter,等等。

而且,至于我的代码:

  • 构造函数使用 Objects.requireNonNull 检查空值,如下所示:

    公共(public) Foobar(字符串 a){ this.a = Objects.requireNonNull(a, "a");

  • 每当我在项目或 Objects.requireNonNull 中使用 Guava 框架时,方法都会使用 Preconditions.checkNotNull 检查空值:

    public void foobar(String a) { Preconditions.checkNotNull(a, "a");

使用其中一个取决于我是否重用该值。

我不会每次都检查方法参数,而是主要在 public 方法中检查。我的想法不是替换默认的运行时检查,它比我能做的更有效地抛出 NullPointerException


我目前在所有参数、字段、方法结果(返回)上使用 @Nonnull@Nullable 注释,但我想知道什么是真正最好的:

  • 我怎么知道我的字段和方法结果在默认情况下是非空的? (@ParameterAreNonnullByDefault 对它们不起作用)。我想要一种可移植的方式(我有 read here 我可以创建自己的注释,具有特定的名称,这适用于 findbugs)
  • 如果我用 @ParameterAreNonnullByDefault 注释包 com.foobar,它是否也适用于 com.foobar.example
  • 当被 @Nonnull 注释时,我是否应该检查每个参数(我目前正在检查构造函数参数)?

此外,从 Eclipse 3.8 开始,有基于注释的空值检查。但我对一些“简单”的案例有疑问:

@ParameterAreNonnullByDefault
class Foobar<E extends Throwable> {
@Nullable private Constructor<E> one;
@Nullable private Constructor<E> two;

public Foobar(Constructor<E> one, @Nullable Constructor<E> two) {
this.one = Objects.requireNonNull(one, "one");
this.two = two;
}

// don't care about exceptions.
public E getInstance(String msg, Throwable t) {
if (null == two) {
return (E)one.newInstance(msg).initCause(t);
}
return two.newInstance(msg, t);
}
}

为什么告诉我 two 在那个位置可以为 null,为什么他警告我对 two 的潜在 null 访问?

最佳答案

getInstance 中的 two 变量的警告而言,null 分析不够聪明,无法确定该字段不能为 null。您可以使用局部变量解决此问题:

public E getInstance(String msg, Throwable t) { 
final Constructor<E> localTwo = two;
if (null == localTwo) {
return (E)one.newInstance(msg).initCause(t);
}
return localTwo.newInstance(msg, t);
}

Preferences > Java > Compiler > Errors/Warnings > Null analysis 中有一个设置Enable syntactic null analysis for fields,它允许这样的代码:

if (two != null) {
return two.newInstance(msg, t);
}

没有警告。

关于java - JSR-308 : Clarification on Nonnull, ParameterAreNonnullByDefault 以及 Eclipse Kepler 检测它的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21800256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com