如果对象尚未分配,我需要分配一个对象。
Object obj;
While(true){
if(obj == null) obj = new Object();
//do other things
}
或
Object obj;
boolean isObjAssigned;
While(true){
if(!isObjAssigned) obj = new Object();
//do other things
}
这两种检查方法中的哪一种是更好的做法?
答案 0 :(得分:1)
上下文中最好的,恕我直言,语法只是将赋值拉出循环:
Object obj = new Object();
while (true) {
// do other things
}
在更详细的例子中,例如
Object obj; // obj contains trash, not necessary null
Boolean isObjAssigned = false; // note "= false;"
if (...) { // obj can be either assigned or not (depending on the condition)
obj = ...
isObjAssigned = true; // do not forget this
}
while (true) {
if (!isObjAssigned) {
obj = new Object();
isObjAssigned = true; // do not forget this in order not to reassign obj
}
// do other things
}
在一般情况 中,您必须使用Boolean
标志。
答案 1 :(得分:1)
编译器不允许您以第一种方式编写,并且它抱怨“变量可能尚未初始化”。它会强制你把它作为null。在那种情况下,再次检查相同的null是多余的。不过第一个更好!因为我们应该使用尽可能少的变量。
Object obj=null;
while(true){
if(obj == null) obj = new Object();
//do other things
}
答案 2 :(得分:0)
有时可能会从其他地方为null
分配对象。
因此检查null并分配。没关系。选择第一种方式。
看起来根本没需要布尔值。但是这里是getach,如果你不想重新分配它,请使用布尔值并将其锁定(它会记住final
关键字;)。
答案 3 :(得分:0)
如果你想在方法中进一步重用条件isObjAssigned
,那么两者之间可能没有任何性能差异,然后使用局部变量进行检查,否则在null
中检查它{ {1}}块应该是自解释的
答案 4 :(得分:0)
我更喜欢第一个:
Object obj;
while(true){
if (obj == null) obj = new Object();
//do other things
}
在第二个示例中,您将Boolean
的值与Object
相关联,这种方法也可能导致错误,因为您可能会意外设置{{1}的值1}}到Boolean
,没有实例化true
。
这样您就可以假设Object
已根据Object
值进行了实例化,并且您将获得Boolean
。
答案 5 :(得分:0)
第二种方法将抛出NullPointerException,因为您使用的是boolean
(java.lang.Boolean
)的对象版本。
而是使用boolean
。
但是,我建议使用第一种方法,否则可能存在对象分配和isObjAssigned
标记不同步的风险。