Java 检查条件安全并在同一if声明中进行评估

Java 检查条件安全并在同一if声明中进行评估,java,type-safety,Java,Type Safety,检查是否可以计算条件,然后在同一if语句中计算表达式,这被认为是良好做法还是安全做法 例如: int[] values = new int[] { 1, 2, 3, 4 } int index = 4; if (index < values.length && values[index] == 4) { System.out.println("value is 4") } int[]values=新的int[]{1,2,3,4} int指数=4; 如果(索引

检查是否可以计算条件,然后在同一if语句中计算表达式,这被认为是良好做法还是安全做法

例如:

int[] values = new int[] { 1, 2, 3, 4 }
int index = 4;
if (index < values.length && values[index] == 4) {
    System.out.println("value is 4")
}
int[]values=新的int[]{1,2,3,4}
int指数=4;
如果(索引

在本例中,条件是
values[index]==4
,我使用
index
检查调用它是否安全。然而,我在相同的if语句中这样做。这样做可以吗?

是的,这是正确的方法,因为在Java中有一种称为短路评估(也称为惰性评估)的机制。这意味着JVM检查第一个条件,如果这是false,JVM知道无论第二个条件的结果是什么,它都不会改变任何东西,所以跳过第二个条件。在您的示例中,如果
index
大于
values.length
,则整个if语句为false,因此省略第二个条件


编辑:

如前所述,位运算符(
&
)和逻辑运算符(
&
|
)之间存在显著差异。从技术上讲,结果应该是相同的,但按位运算符的计算结果是相同的,所以两边都要进行。在您的示例中,这可能会导致
OutOfBoundException


此外,位运算符的优先级较低,因此,如果您意外地混合使用逻辑运算符和位运算符,则可以接收。

&&和| |正是出于这个原因。如果使用&或|,则会计算所有语句。我看不出你的代码有任何缺陷。正如我所说的,是的,它是安全的。第二个条件只有在第一个条件得到验证时才进行测试。该示例太短,没有意义,实际用于生产。@AdamSiemion这是一个演示问题的简短示例,不是吗?这并不意味着它必须有用。为了让你的答案更好、更具信息性,我建议你添加一个对按位
&
运算符的引用,它的工作原理与布尔值上的
&
类似,只是它不会短路。