我正在尝试编写一个使用@Nonnull来标记所需参数的不可变数据类。不幸的是,无论我写它的方式,FindBugs标志着一个警告:
/**
* An error occuring during migration
*/
@Immutable
@ParametersAreNonnullByDefault
public static final class MigrationError extends MigrationResult
{
private final String message;
private MigrationError(String message)
{
this.message = message;
}
@Override
public boolean isSuccess()
{
return false;
}
@Nonnull
public final String getMessage()
{
return message;
}
@Override
public MigrationError asError()
{
return this;
}
}
如上所述,这会导致正确性警告 - 空指针取消引用,Method可能返回null,但声明为@Nonnull。我试过在构造函数中添加一个null检查:
private MigrationError(String message)
{
if (message == null)
{
throw new IllegalArgumentException("Error message cannot be null");
}
this.message = message;
}
然而,警告仍然存在,我现在还有一个来自Intellij的警告:'message == null'始终为false。如果我在getter中添加一个null检查:
@Nonnull
public final String getMessage()
{
if (message == null)
{
return "";
}
return message;
}
我从IntelliJ得到了相同的警告,FindBugs给了我一个新的警告:狡猾的代码:与null的冗余比较:已知非空值的冗余nullcheck。如果我删除显式空检查并将@Nonnull
添加到message
字段,我会收到相同的FindBugs警告。
我可以抑制警告,但我想知道FindBugs的期望。是否有一些模式用于声明不可变字段NonNull?它是否是其父类中的静态嵌套类是否重要?