1

因此,根据维基百科和其他人的说法,一个boolean值应该只有两种状态:01truefalseyesno;等等...

好的,如果我错了,请纠正我,但是,JavaBoolean包装器让开发人员有 3 种状态truefalsenull.

那不是错了吗?

我知道它可以用“布尔是一个对象”等来解释,但是,如果 javac 自动“包装”nullfalse恕我直言,那就太好了。

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

不管怎样,你怎么看?我是在遵循错误的思路……还是真的“错误”?


编辑

我知道什么是,和等null之间的区别等等(我有 3 年以上的 java 经验)。booleanBoolean

我的观点是关于概念本身,例如在 Ruby 中,如果我做类似的事情if something,如果这个something实例是nil,它将是false.

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

4

7 回答 7

11

null表示没有值,而truefalse是确定的值。这是肯定或否定地知道某事与根本不知道之间的区别。这是一种思考方式。

从技术上讲 a Booleancan的原因null是因为它是一个对象引用,而不是一个boolean值本身,自动装箱可能会给您带来混乱。过去,您必须手动创建Boolean对象以包含值并手动从对象中boolean提取值。从 Java 5 开始,编译器会为您解决这个问题。booleanBoolean

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

boolean为什么和Boolean你可能会问有什么不同?嗯,在 Java 中,与许多较新的语言不同,原始类型不是类,原始类型不是对象。当您想这样对待它们时,例如当您想通过引用传递或调用它们的方法或将它们放入集合中时,您必须将它们装箱在它们各自的原始包装类中。

于 2012-12-13T18:05:01.840 回答
3

如果它的三值特性Boolean不适合您,请不要使用它。使用boolean. 有时你需要Boolean,当你使用Object面向接口的时候。发生这种情况时,您使用Boolean.

  • boolean是表示您所描述的概念的原始类型,具有两个可能值的类型:真和假。

  • Boolean是不同的类型。这是一个Object具有boolean价值的东西。如果对象不存在,则引用为空。不是布尔对象为空,而是对布尔对象的引用为空。

尽管它们的名称相似,但不要将boolean和混为一谈Boolean。它们是不同的类型,这是有充分理由的。

于 2012-12-13T18:07:48.107 回答
2

由于您有一个booleanwhich 可以是两种状态,因此使用它没有意义,Boolean除非

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

通常,如果可以,请始终使用原语,除非 a)您需要一个null值 b)由于 API 而必须。

于 2012-12-13T18:07:55.643 回答
1

您的意思是包装器应该模仿原始“真实”布尔值的严格行为。那就是问题所在。布尔值在概念上与布尔值不同(注意大写)。

原始布尔值提供了 Wikipedia 中描述为布尔值的内容。

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

如果您采取这种观点,它非常简单和合乎逻辑。

于 2012-12-13T18:11:54.960 回答
0

您对原始boolean和原始包装器感到困惑Boolean。确实boolean可以truefalse只有。

Boolean实例可以持有truefalse太。但是如果实例不存在,则引用是null任何未初始化的引用。

于 2012-12-13T18:05:34.060 回答
0

null意思是“我这里没有对象”。该Boolean true对象是对原语的包装boolean true,但它仍然是一个对象。请注意,以下代码会抛出一个NullPointerException

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

  System.out.println(primBool);
}
于 2012-12-13T18:07:58.813 回答
0

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

Col-1 : 小时 (nvarchar)

Col-2 : 分钟 (nvarchar)

Col-3 : IsDay (bool)

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

于 2012-12-13T18:19:03.920 回答