为什么布尔对象在Java中有一个公共构造函数?

为什么布尔对象在Java中有一个公共构造函数?,java,boolean,Java,Boolean,Java状态下构造函数新布尔值(布尔值)的文档: 注意:很少使用此构造函数。除非需要新实例,否则静态工厂valueOf(boolean)通常是更好的选择。它可能会产生显著更好的空间和时间性能 如果是这样,为什么这个构造函数是公共的而不是不推荐的?是否有充分的理由使用此构造函数而不是Boolean.valueOf()?它没有被弃用的原因是Java保持了与1.0版的向后兼容性 我想不出使用构造函数的好理由。valueOf()只是在Java1.4中添加的,因此构造函数的存在似乎是为了向后兼容 解释不弃

Java状态下构造函数
新布尔值(布尔值)
的文档:

注意:很少使用此构造函数。除非需要新实例,否则静态工厂
valueOf(boolean)
通常是更好的选择。它可能会产生显著更好的空间和时间性能


如果是这样,为什么这个构造函数是公共的而不是不推荐的?是否有充分的理由使用此构造函数而不是
Boolean.valueOf()

它没有被弃用的原因是Java保持了与1.0版的向后兼容性

我想不出使用构造函数的好理由。

valueOf()
只是在Java1.4中添加的,因此构造函数的存在似乎是为了向后兼容

解释不弃用构造函数的原因:

由于不推荐API可能造成的中断,当前API 必须是“主动危险”才能被弃用,如Thread.stop。 虽然使用这个构造函数肯定是不明智的,但它不是 上升(或下降)到危险的标准,在 JDK。将来,我们可能会添加一个“诋毁”设施来标记 API元素并不是那么糟糕,不应该被弃用, 但在大多数情况下不应使用。这个构造函数将是一个很好的方法 诽谤的候选人


我想不出使用
布尔
构造函数是做有用事情的最佳方式的现实场景。

通常,您会希望直接使用
valueOf(Boolean)
甚至
Boolean.TRUE
/
Boolean.FALSE
常量


但请考虑一个场景,其中您希望使用私有
布尔
变量作为同步线程的监视器。在这里,您需要确保使用自己的实例并完全控制它。

另一个不一定很好的理由可能是简单地将其与其他本机包装保持一致

从Java 9开始,
Boolean(Boolean)
构造函数已被弃用;看


对于那些关心历史的人来说,有一个长期存在的问题,那就是不赞成构造函数。它是在年正式提出的,还有许多其他的反对意见。

将它标记为反对意见并不能阻止它向后兼容。事实上,这就是问题的关键所在。尽管Java没有保持与1.0版的向后兼容性:一些JDK(我不知道是什么原因,1.4和1.7)引入了不能在早期JRE上运行的结构。他们只是非常不愿意破坏任何东西,并且认为这个糟糕的构造函数不够危险,不能保证破坏向后兼容性。@amalloy,那就是向前兼容性;向后兼容性是早期JRE上可运行的构造可以在后期JRE上运行的保证(这也是Java泛型通过类型擦除实现的原因之一,而原始类型仍然是一个问题);实际上,还有成千上万的其他对象可以用作监视器。我不认为在该集合中保留
Boolean
是高优先级的。虽然不重要,但这是一个很好的用例,valueof方法可能会返回重复的对象,有时你不想要that@Costi
new Boolean(布尔值)
ValueOf(布尔值)的点
是不是您有一个
布尔值
并且需要一个
布尔值
来使用需要使用'b'的常量?Boolean.TRUE:Boolean.FALSE。这比前两种方法好多少?@Hemal,“new”创建一个新实例。由于布尔值是不可变的,这通常是对对象的浪费-valueOf()返回两个对象之一Boolean.TRUE或Boolean.FALSE。使用Boolean.TRUE/FALSE比valueOf()更快,因为选择TRUE或FALSE是在编译时完成的。当然,如果您在运行时之前不知道它是哪个,那么与valueOf()相比没有任何优势。@Ed,好吧,我同意
new
不是一个好主意。我也同意
Boolean.TRUE
Boolean.valueOf(TRUE)
更可取,但这不是讨论的重点。Integer具有相同的构造函数new Integer(int value)@Ict30是的,但是可能会为
Integer
创建40亿个对象。对于
Boolean
,只有2个。这里没有相似之处。要有信心!这是一个相当合理的理由。我怀疑的主要是Java创建者,而不是我自己:)也许需要一个注释
@discomped
或者一些东西来表明它不是主动危险的,但实际上没有一个很好的理由这样做。如果想要一个也可以封装位标志的锁令牌怎么办?可以为此编写自定义类型,但
Boolean
已经存在。@supercat我认为
AtomicBoolean
可能是一个更好的选择。或者
信号量
,尽管对于一个简单的标志来说,这可能太花哨了。我们需要的是一个正确的解释为什么这是不好的。每个人似乎都在重复鹦鹉学舌的说法,认为这是不好的,但关于为什么valueOf更好,以及Oracle/Sun Microsystems为什么不从其构造函数内部调用valueOf而不影响开发人员的信息却很少。