Java布尔是“错误的”吗?

时间:2012-12-13 18:01:17

标签: java

因此,根据维基百科和其他人的观点,boolean值应该只有2个状态:01; truefalse; yesno;等等...

好的,如果我错了,请纠正我,但是,Java Boolean包装器让开发人员有3个状态:truefalsenull

这不是错吗?

我知道它可以用“布尔是一个对象”等等来解释,但是,如果javac自动“包裹”nullfalse,恕我直言,那将是非常好的。 / p>

我的观点是:这种行为让开发人员做了很多废话,因为他们使用Boolean而不是正确的对象类型。

无论如何,你怎么看待它?我是否遵循了错误的思路......或者它是否真的“错误”?


修改

我知道什么是nullbooleanBoolean之间的差异等等(我有3年+ exp与java)。

我的观点是关于概念本身,例如在Ruby中,例如,如果我执行类似if something的操作,如果此something实例为nil,则它将为{{1 }}

我并不是说Java是废话或类似的东西,我每天都在使用它。

7 个答案:

答案 0 :(得分:11)

null表示缺少值,而truefalse表示定值。知道某些事情,无论是肯定的还是消极的,而不是完全不了解它之间的区别。这是思考它的一种方式。

从技术上讲,Boolean可能是null的原因是因为它是一个对象引用,而不是boolean值本身,autoboxing可能会对您造成混淆。过去,您必须手动创建Boolean个对象以包含boolean值,并从boolean个对象手动提取Boolean值。从Java 5开始,编译器将为您解决此问题。

boolean对象包含的Boolean的值可以是truefalse,但是对象变量可能根本不指向对象,在这种情况下,引用的值为null

为什么您可能会问booleanBoolean之间的区别?好吧,在Java中,与许多较新的语言不同,原始类型是不是类,而原语是不是对象。当您想要对它们进行处理时,例如当您希望通过引用传递或调用方法或将它们放入集合中时,您必须将它们打包在各自的primitive wrapper classes中。

答案 1 :(得分:3)

如果Boolean的三重性质不适合您,请勿使用。使用boolean。当您使用面向Boolean的界面时,有时需要Object。发生这种情况时,请使用Boolean

  • boolean是一种原始类型,表示您描述的概念,一种具有两个可能值的类型:true和false。

  • Boolean是不同的类型。它是Object,其值为boolean。如果该对象不存在,则引用为空。它不是布尔对象null,它是对布尔对象的引用,它是null。

虽然他们的名字很相似,但请不要混淆booleanBoolean。它们是完全不同的类型。

答案 2 :(得分:2)

由于您的boolean可以是两种状态,因此使用Boolean是没有意义的,除非

  • 你需要三个州
  • 您正在使用API​​,这意味着您必须这样做。

一般情况下,如果可以,请始终使用原语,除非a)您需要null值b)您必须使用API​​。

答案 3 :(得分:1)

你暗示的是包装器应该模仿原始'real'布尔值的严格行为。那就是问题所在。布尔在概念上与布尔值(注意大写)不相同。

原始布尔值将维基百科中描述的内容提供为布尔值。

布尔值(java.lang.Boolean)不会被称为show的包装器。它在概念上是一个包含布尔值的对象。因此,对布尔值的引用是 references ,与布尔值没有任何共同之处。因此,引用的规则适用,而不是原语。

如果你采用这种观点,那就非常简单和符合逻辑。

答案 4 :(得分:0)

您对原始boolean和原始包装Boolean感到困惑。确实boolean只能是truefalse

Boolean个实例也可以容纳truefalse。但是,如果实例不存在,则引用为null,因为任何未初始化的引用。

答案 5 :(得分:0)

null表示“我这里没有对象”。 Boolean true对象是原始boolean true的包装器,但它仍然是一个对象。请注意,以下代码会引发NullPointerException

public static void main(String[] args) {
  Boolean myBool = null;
  boolean primBool = myBool;

  System.out.println(primBool);
}

答案 6 :(得分:0)

Null使其可为空,当您创建数据库时,例如它有一个包含以下列的表:

Col-1:小时(nvarchar)

Col-2:Minute(nvarchar)

Col-3:IsDay(布尔)

因此,如果小时为18分钟且分钟为00,那么IsDay的价值是多少? (这也不是真或假)此时它是空的......