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

Java check if a boolean is initialized

我不是在谈论检查布尔值是否为 null 作为检查它是否已初始化的方法。因为那行不通。所以我认为这可能有效:

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

}

布尔值是原始类型,因此不需要初始化。布尔值的默认值为 false.

第一个代码示例 returns false 因为短语 true && false 将始终等同于 false(&& 检查两个语句是否为真,它们不是,所以它是false) 然后你检查 setting 是否也是 false 不等于那个,它不是。因此,initialized 变量可能会有用。

您可以阅读有关默认值和原始类型的更多信息here

if (setting != (true && false)) 并没有按照您的想法去做。

表达式 (true && false) 的计算结果总是 false:您正在对文字值 truefalse.

进行逻辑与运算

这意味着您的测试减少到 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...
    }
}

(setting != (true && false)) 的问题已经讨论过了,但真正的问题是原始 boolean 只有两个明显的选择。它总是 truefalse。如果这两个都是有意义的答案,那么该值不能 also 指示它是否已被初始化。已初始化的、有意义的 false 看起来与未初始化相同。

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

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

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

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