Java检查是否初始化了布尔值

时间:2015-04-27 02:24:30

标签: java initialization boolean

我不是在讨论检查布尔值是否为空以检查它是否已初始化。因为那不会奏效。所以我认为这可行:

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;
    }

}

3 个答案:

答案 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:您正在对文字值truefalse进行逻辑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 只有两个明显的选项。它始终是 truefalse。如果这两个都是有意义的答案,那么该值不能表明它是否已被初始化。一个初始化的、有意义的 false 看起来和没有初始化一样。

如果可用,最好的解决方案是,正如 Cameron Skinner 在上面回答的那样,确保变量总是通过在声明或构造函数中这样做来初始化。但是,这要求在实例化类时知道 setting 应该是什么的答案。

如果此时不一定知道正确的值并且可能需要稍后设置(因此故意设置为 false 与从未设置的情况不同),那么您有几个选择:

一个如最初的帖子所示,有一个单独的 initialized 变量告诉你它是否发生了。这可能看起来有点笨拙,但确实有效。

另一个选项是对 Boolean 使用 boolean 对象而不是 setting 原语。 Boolean 对象可以设置为 truefalse,但它最初默认为 null,因此您可以使用 null 检查来确定是否是否已设置。