我有一个布尔值来初始化,具体取决于条件。我想知道最好的方法是什么,如果有的话,根据代码优化,或者只是个人品味的问题。
#p>方式#1:boolean conditionIsTrue;
if(object == whatItShould){
conditionIsTrue = true;
} else {
conditionIsTrue = false;
}
方式#2:
boolean conditionIsTrue = false;
if(object == whatItShould){
conditionIsTrue = true;
}
编辑:我不是在寻找用object.equals或其他方法更改代码的替代方法,这个条件是一个例子,通常它们更复杂。我想做的只是#1和#2之间的最佳方式。
答案 0 :(得分:3)
假设object
和whatItShould
是原始类型并且可以使用==
进行比较,则应使用==
:
conditionIsTrue = (object == whatItShould);
假设object
和whatItShould
是对象引用,您应该使用equals
方法:
conditionIsTrue = (object.equals(whatItShould));
请注意,equals
方法(如果未被覆盖)将使用==
结束比较参考。
从你的编辑:
我不是在寻找用object.equals或其他方法来改变代码的替代方法,这个条件就是一个例子,通常它们更复杂。我想做的只是#1和#2之间的最佳方式。
您应该准确发布您正在寻找的内容,因此特定编程问题不会有任何双重解释。
无论如何,您可以使用默认值初始化变量,并在几个条件之后定义实际值(使用int
变量,因为boolean
具有误导性):
int myVariable = 0;
if (<condition1> && <condition2> &&
(<condition3> || <condition4>) ...) {
myVariable = //real value
}
这样,如果并非所有路径都相应地初始化变量,则可以避免编译器问题,这可能在使用第一种方法时发生。
但是,如果您的条件只有一行,那么使用Ternary Operator会更好:
int myVariable = (condition1> && <condition2> &&
(<condition3> || <condition4>) ...) val1 : val2;
此外,您可以嵌套三元运算符,以防有多条路径:
int myVariable = (<condition1>) ?
val1 : (<condition2> && <condition3>) ?
val2 : val3;
答案 1 :(得分:1)
第一种方式对我来说更好看。 条件及其后果是明确的,您确定只做一项任务。所以你的变量也是最终的。 但是,它并不是表现的灵丹妙药。
答案 2 :(得分:0)
执行此操作的正确方法是使用object.equals(anotherobject);
。您可以使用"A" == "A"
和String a = "A"; a.equals("A");
答案 3 :(得分:0)
我认为你正在努力避免这种结构(最佳版本),这可能会让人感到有些困惑
boolean conditionIsTrue = object == whatItShould; //usual disclamer about this testing reference equality not value equality for objects
这个,我接受看起来有点......第一次观看时很奇怪,==
和=
在附近。但是,您可以自由修改它,使其看起来更令人愉悦:
boolean conditionIsTrue= (object == whatItShould);
此外,对于更复杂的条件,您可以根据需要使用换行符
boolean conditionIsTrue=
object == whatItShould ||
object == alternative ||
(useBadAlternative && object == badAlternative);
条件变得越复杂,就越不喜欢没有if语句悬挂在它背后。
你提到优化;当我正在优化时,我尽量删除if语句(甚至是合理的语句);它们是分支指令,可以减慢处理器的速度,因为管道不会提前知道代码将关闭哪个分支(it does try to guess但它经常会出错)。假设你关心代码效率(也就是这个瓶颈),而代码优化意味着加速'冗余if'会让你失望(假设智能编译器不会删除它)