我不是在讨论检查布尔值是否为空以检查它是否已初始化。因为那不会奏效。所以我认为这可行:
public class MyClass{
private boolean setting;
private boolean getSetting{
// get the setting;
}
public void main{
if (setting != (true && false))
setting = getSetting();
// do main stuff;
}
}
确实如此!所以我的问题是:与替代方案相比,这是一个很好的做法,即使用额外的变量:
public class MyClass{
private boolean initialized = false;
private boolean setting;
private boolean getSetting{
// get the setting;
}
public void main{
if (!initialized)
setting = getSetting();
initialized = true;
// do main stuff;
}
}
答案 0 :(得分:5)
布尔值是一种原始类型,因此它们不需要初始化。布尔值的默认值为false
。
第一个代码示例返回false,因为短语true && false
将始终等于false(&&
检查两个语句是否都为真,它们不是,所以它是假的)然后你检查如果setting
,也是false
,则不等于它,而不是initialized
。因此,import scipy as sp
import numpy as np
from numpy.random import *
from pylab import *
fwd = 0.5 #Probability to move forward
bwd = 1 - fwd #Probability to move backwards
N = 100 #Number of Steps
d_avg = 0
# Takes one step per second (Per N)
time = np.arange(N)
position = np.zeros(N)
for i in range (N-1):
rn = np.random.uniform(0,1) # This generates a random number between (x,y)
if rn < fwd: # If the random number picked is >0.5
step = 1 # move forward 1 step
else:
step = -1 # If the random number picked is not >0.5, then move backwards
position[i+1]=position[i]+step
d_avg+=position[i]
print(d_avg/N)
plot(time,position,'g-')
savetxt('1Dtrajectory.dat',position)
show()
变量可能很有用。
您可以阅读有关默认值和基本类型here的更多信息。
答案 1 :(得分:1)
if (setting != (true && false))
并没有按照您的想法行事。
表达式(true && false)
始终评估为false
:您正在对文字值true
和false
进行逻辑AND。
这意味着您的测试会缩短为if (setting != false)
。由于setting
未初始化,因此默认为false
。代码运行时,它会检查if (false != false)
,其结果为false
。
当我运行您发布的代码时,它不会按预期调用getSetting
。
在您的示例中,最佳做法是在构造函数中初始化变量:
public class MyClass {
private boolean someSetting;
public MyClass() {
someSetting = getSetting();
}
private boolean getSetting() {
...
}
public void main() {
// By the time this is called we can guarantee that someSetting has been initialized correctly
// Do main stuff...
}
}
答案 2 :(得分:0)
(setting != (true && false))
的问题已经讨论过了,但真正的问题是原始 boolean
只有两个明显的选项。它始终是 true
或 false
。如果这两个都是有意义的答案,那么该值不能也表明它是否已被初始化。一个初始化的、有意义的 false
看起来和没有初始化一样。
如果可用,最好的解决方案是,正如 Cameron Skinner 在上面回答的那样,确保变量总是通过在声明或构造函数中这样做来初始化。但是,这要求在实例化类时知道 setting
应该是什么的答案。
如果此时不一定知道正确的值并且可能需要稍后设置(因此故意设置为 false 与从未设置的情况不同),那么您有几个选择:
一个如最初的帖子所示,有一个单独的 initialized
变量告诉你它是否发生了。这可能看起来有点笨拙,但确实有效。
另一个选项是对 Boolean
使用 boolean
对象而不是 setting
原语。 Boolean
对象可以设置为 true
或 false
,但它最初默认为 null
,因此您可以使用 null
检查来确定是否是否已设置。