正确制定常数条件?

时间:2019-06-15 13:20:49

标签: java compiler-warnings compile-time-constant

我的项目中有一个常数,它表示一段时间。当它小于0时,我要禁用与时间跨度相关的检查。

通常一个人会检查

if(CONSTANT > 0) foo();
else bar();

但这会导致警告“条件始终为'false'”或“条件始终为'true'”。

是否有一种方法可以避免此警告,以防止另一个开发人员只这样做呢?


编辑: 我的问题有点太笼统了。抱歉。

我有一个计时器,经过一段时间TIME_FOR_AUTH(常量)后,它清除了我的模型。这是一种安全措施,在测试时会出现问题。因此,我在代码中添加了if(TIME_FOR_AUTH > 0) ...支票。

现在我得到了描述的警告。由于IntelliJ总是要求我删除此构造(而且我在这个项目中并不孤单),所以我想知道Java是否有这样做的常规做法/有可能抑制警告。

2 个答案:

答案 0 :(得分:4)

起初,这只是一个警告。

第二,您可以使用@SuppressWarnings注释取消警告。对于“始终为true / false”警告,它将为@SuppressWarnings("ConstantConditions")

代码示例:

package stackoverflow;

public class SuppressWarningsExample {

    @SuppressWarnings("ConstantConditions")
    public static void main(String[] args) {
        final int value = 100;

        if (value > 0)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}

对于IntelliJ IDEA,您还可以使用内嵌// noinspection <InspectionName>注释来抑制每个表达式的警告:

// noinspection ConstantConditions
if (value > 0)
    System.out.println("Yes");
else
    System.out.println("No");

答案 1 :(得分:4)

这里:

if(CONSTANT > 0) foo();

您自己说。这是常数。因此,从一开始它就大于或小于0。这样,编译器便高兴地将以上内容转换为:

if(...x... > 0) foo();

其中x是您分配给CONSTANT的实际值。所以就在编译时,这变成了

if (true)

if (false)

长话短说:重新考虑自己在做什么。可能您不应该比较自己的常数,而是类似:

LocalDateTime endTime = LocalDateTime.now().plusHours(1);

,然后,以后:

if (LocalDateTime.now().isAfter(endTime)) {

或类似的东西。

换句话说:比较恒定值以识别特定条件根本没有多大意义。取而代之的是,您可以使用常量来计算一些“结束时间”,然后随着时间的推移,对照该“结束时间”检查当前时间。尤其是在使用LocalDateTime之类的类时,如上所示,计算以后的时间戳非常容易。

编辑,考虑到对问题的编辑:我仍然建议在生产代码中不要使用这种构造。取而代之的是,我将研究方法,以便测试设置可以以一种允许它有效地禁用这种超时机制的方式配置生产。例如,通过注入一个在合理的测试执行时间内不会被击中的超时!