在 IntelliJ IDEA 中禁用字段的“恒定条件和例外”检查

Cho*_*ter 6 java intellij-idea minecraft minecraft-forge

我正在使用一个框架(Minecraft Forge),它将特定对象注入到public static final具有值的字段中null(通过@CapabilityInject@ObjectHolder注释)。不幸的是,每当我在不允许null值的上下文中引用这些字段之一时,IntelliJ IDEA 中的“常量条件和异常”检查都会警告我该字段可能是null(因为它不知道注入)。

我知道这些字段在被访问时不会出现null,所以我想禁用它们的警告。

有没有办法禁用特定字段或类中所有字段的警告?添加@SuppressWarnings("ConstantConditions")//noinspection ConstantConditions到字段不会删除字段访问的警告,而将注释添加到字段的类只会删除该类中的警告。

我想避免添加//noinspection ConstantConditionsnull检查我访问字段的每个位置。

Cho*_*ter 3

diesieben07 在我的Minecraft Forge 论坛上的帖子中回答了这个问题。

解决方案/解决方法是创建一个始终返回 的方法null,用@Nonnull和对其进行注释@SuppressWarnings("ConstantConditions"),然后使用它来初始化将注入的字段。

例如:

public class Injection {

    @CapabilityInject
    public static final Capability<IItemHandler> CAPABILITY = getNull();

    @Nonnull
    @SuppressWarnings({"ConstantConditions", "SameReturnValue"})
    private static <T> T getNull() {
        return null;
    }

    public void doStuff() {
        // No warning
        Capability<IItemHandler> capability = CAPABILITY;
    }
}
Run Code Online (Sandbox Code Playgroud)

Salamander 在我的WTDWTF帖子中提供了替代解决方案。

他们建议将初始化移至静态初始化块,而不是内联初始化字段。这看起来比总是返回的方法更简单null,但如果有很多字段需要初始化(在我的例子中就有),它也会增加很多混乱。

例如:

public class Injection {

    @CapabilityInject
    public static final Capability<IItemHandler> CAPABILITY;

    static {
        CAPABILITY = null;
    }

    public void doStuff() {
        // No warning
        Capability<IItemHandler> capability = CAPABILITY;
    }
}
Run Code Online (Sandbox Code Playgroud)