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
:您正在对文字值 true
和 false
.
进行逻辑与运算
这意味着您的测试减少到 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
只有两个明显的选择。它总是 true
或 false
。如果这两个都是有意义的答案,那么该值不能 also 指示它是否已被初始化。已初始化的、有意义的 false
看起来与未初始化相同。
如果可用,最好的解决方案是,正如 Cameron Skinner 在上面回答的那样,确保变量 总是 通过在声明的地方或构造函数中这样做来初始化。然而,这要求在实例化 class 时知道 setting
应该是什么的答案。
如果此时不一定知道正确的值并且可能需要稍后设置(因此故意设置为 false 与从未设置的情况不同),那么您有几个选择:
一个是如开头post所示,有一个单独的initialized
变量告诉你它是否发生了。这可能看起来有点笨拙,但它确实有效。
另一种选择是使用 Boolean
对象而不是 setting
的 boolean
原语。 Boolean
对象可以设置为 true
或 false
,但它最初默认为 null
,因此您可以使用检查 null
来确定是否是否已设置
我不是在谈论检查布尔值是否为 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
:您正在对文字值 true
和 false
.
这意味着您的测试减少到 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
只有两个明显的选择。它总是 true
或 false
。如果这两个都是有意义的答案,那么该值不能 also 指示它是否已被初始化。已初始化的、有意义的 false
看起来与未初始化相同。
如果可用,最好的解决方案是,正如 Cameron Skinner 在上面回答的那样,确保变量 总是 通过在声明的地方或构造函数中这样做来初始化。然而,这要求在实例化 class 时知道 setting
应该是什么的答案。
如果此时不一定知道正确的值并且可能需要稍后设置(因此故意设置为 false 与从未设置的情况不同),那么您有几个选择:
一个是如开头post所示,有一个单独的initialized
变量告诉你它是否发生了。这可能看起来有点笨拙,但它确实有效。
另一种选择是使用 Boolean
对象而不是 setting
的 boolean
原语。 Boolean
对象可以设置为 true
或 false
,但它最初默认为 null
,因此您可以使用检查 null
来确定是否是否已设置