Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确地表述常数的条件?_Java_Compiler Warnings_Compile Time Constant - Fatal编程技术网

Java 正确地表述常数的条件?

Java 正确地表述常数的条件?,java,compiler-warnings,compile-time-constant,Java,Compiler Warnings,Compile Time Constant,我的项目中有一个常数,它代表一些时间跨度。当它低于0时,我想禁用与时间跨度相关的检查 通常人们会检查 if(CONSTANT > 0) foo(); else bar(); 但这会导致警告“条件始终为'false'”或“条件始终为'true'”,具体取决于常数的值 有没有办法绕过这个警告,以防止另一个开发人员仅仅使用这条线路? 编辑: 我的问题有点太笼统了。很抱歉 我有一个计时器,在经过一段时间后,清除我的模型。这是一种安全措施,在测试时会产生问题。因此,我在代码中添加了一个检查,if

我的项目中有一个常数,它代表一些时间跨度。当它低于0时,我想禁用与时间跨度相关的检查

通常人们会检查

if(CONSTANT > 0) foo();
else bar();
但这会导致警告“条件始终为'false'”或“条件始终为'true'”,具体取决于常数的值

有没有办法绕过这个警告,以防止另一个开发人员仅仅使用这条线路?
编辑: 我的问题有点太笼统了。很抱歉

我有一个计时器,在经过一段时间后,清除我的模型。这是一种安全措施,在测试时会产生问题。因此,我在代码中添加了一个检查,
if(TIME\u FOR\u AUTH>0)


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

首先,这只是一个警告

第二步,您可以使用
@SuppressWarnings
注释抑制警告。对于“始终为真/假”警告,它将是
@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
注释抑制每个表达式的警告:

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

你自己说。它是一个常数。因此,从一开始,它要么大于,要么小于0。因此,编译器愉快地将上述内容转换为:

if(...x... > 0) foo();
其中,
x
将是您分配给
常量的实际值。在编译时,这就变成了

if (true)
或者如果(错误)
,则可能是

长话短说:重新思考你在做什么。也许你不应该比较你的常数,但是:

LocalDateTime endTime = LocalDateTime.now().plusHours(1);
然后,后来:

if (LocalDateTime.now().isAfter(endTime)) {
或者类似的

换句话说:比较一个常量值来确定某个条件根本没有多大意义。相反,您可以使用该常数来计算一些“结束时间”,然后,随着时间的推移,根据该“结束时间”检查当前时间。特别是当使用类似的类时,计算稍后的时间戳非常容易,如上所示


编辑,考虑到问题的编辑:我仍然建议在生产代码中不要有这样的构造。相反,我将研究方法,以便测试设置能够以一种允许它有效地禁用这种超时机制的方式配置生产。例如,通过注入一个保证在合理的测试执行时间内不会命中的超时

常量不会更改(这就是您收到警告的原因),否则您误用了这个概念。@Lealcelderio我知道,常量在运行的代码中不会更改。但是我正在使用上面描述的方法在我的程序中启用(或禁用)计时器,并用它设置时间。我不确定还有什么其他的概念可以用于此。你的问题不清楚,正如两个答案之间关于你所问问题的“辩论”所说明的那样!请阅读这些答案,然后澄清你的问题,以便人们能够理解你的实际问题。请通过编辑问题来澄清…当你有意识地知道表达式是常量时,我实际上知道了问题所涉及的东西(你通常这样做是为了暂时排除一些代码。例如,我有时会
if(true){doSomething();return;}
,在一些复杂的调试中只执行方法的一部分,而无需对代码进行剧烈更改),并消除恼人的警告。在本期的文本中,同样的目标明确地定义为“防止另一个开发人员仅执行该行代码”,例如临时只执行代码的一部分,而不删除其余的方法代码。当然,这只是一个警告,但总是建议我删除该段代码;)我不知道这些可以很容易地被抑制。谢谢,我理解删除建议的问题。请注意,您还可以在IDEA中添加
@SuppressWarning
,在有问题的表达式上使用Alt+Enter几乎是自动的→ 如果“语句”选项为“展开”,则右键按“展开”→ 选择一些“抑制…”动作。这是个好主意,谢谢。遗憾的是,它不适合我的具体问题,但我以后会记住它。
if (LocalDateTime.now().isAfter(endTime)) {