我正在玩Java,因为我打算从C#切换到它以用于跨平台目的。我刚刚注意到它有很多方法可以做同样的事情。我只是想知道他们为什么那样做?
一个例子,除了构造函数之外,Boolean类还有两个方法做同样的事情。
Boolean b = new Boolean(true);
Boolean b = new Boolean("true");
Boolean b = Boolean.parseBoolean(true);
Boolean b = Boolean.parseBoolean("true");
Boolean b = Boolean.valueOf(true);
Boolean b = Boolean.valueOf("true");
我可以通过调用变量本身(b)或方法b.booleanValue()来获取布尔值。有人想要调用一个方法来获取布尔值的布尔值,尽管他可以自己调用变量吗?
有什么意义?
答案 0 :(得分:28)
new Boolean(true)和Boolean.valueOf(true)返回Boxed基元...可以在原始布尔值的集合等中使用的真实对象。
Boolean.parseBoolean(“true”)返回原始布尔值。
顺便说一句,
Boolean b = Boolean.parseBoolean(true);
Boolean b = Boolean.parseBoolean("true");
真的是错误。您正在创建一个原始布尔值,然后自动装箱到布尔值。
您应该使用valueOf(true)或valueOf(“true”)代替。
所以这些方法的真正用途是
Boolean b = new Boolean(true); //really this should never be used **
Boolean b = new Boolean("true"); //really this should never be used **
boolean b = Boolean.parseBoolean(true);
boolean b = Boolean.parseBoolean("true");
Boolean b = Boolean.valueOf(true);
Boolean b = Boolean.valueOf("true");
**不要使用它,因为你只是不必要地创建对象。使用valueOf允许重用现有的Boolean对象。由于布尔是不可改变的,所以这很好。
答案 1 :(得分:5)
Boolean.parseBoolean(*String*)
Boolean.valueOf(*String*)
new
Boolean.valueOf(*boolean*)
这些不一样。
答案 2 :(得分:1)
如果您注意到true
和"true"
之间存在差异,则它们不是真正重复的方法/构造函数。 true
表示Java中的原始类型boolean
,但“true”表示值为“true”的java.lang.String
对象。
答案 3 :(得分:1)
Boolean.getBoolean("true")
答案 4 :(得分:1)
有什么意义?
嗯,重点是其中一些替代方案很有用,有些是Java的第一个版本遗留下来的旧方法。
(Java的原始版本匆忙发布,API中存在一些设计错误/不一致。但是,保持向后兼容性的首要要求意味着无法纠正它们。错误是有害的,相关的方法被标记为“已弃用”,以警告程序员不要使用它们。在像这样无害的情况下,方法只是多余的,事情就没有改变了。)
答案 5 :(得分:1)
请注意它们不一样;你的一句话:
Boolean b = Boolean.parseBoolean(true);
会出现语法错误(至少根据Java 6 api)。
Boolean.valueOf(true)
和new Boolean(true)
是不同的函数,因为new Boolean(true)
会创建一个新对象,Boolean.valueOf(true)
会返回一个存储的Boolean对象。
Boolean.parseBoolean
的签名返回一个原始布尔值。在Java 5之前,您需要Boolean.valueOf
将其转换为对象表单。在Java 5之后,系统将自动执行此操作,但(a)Java决定它需要显式的自动装箱形式(因此添加了Integer.valueOf
等)和(b)Java的方法即使在它们变得过时也永远不会被删除。在许多情况下,这本身就是重复的来源(例如,当他们在Java 2中重新组织集合时,但旧的集合类添加了与新系统相匹配的方法,导致重复)。
答案 6 :(得分:0)
Boolean是一个来自Object的类型,对面是b.booleanValue(),它返回一个基本类型boolean。
所以区别在于第一个是对象而第二个是基本类型。
答案 7 :(得分:0)
您列出了一个不存在的,并且您错误地指定了parseBoolean
的返回类型。该列表实际上是:
Boolean b = new Boolean(true);
Boolean b = new Boolean("true");
boolean b = Boolean.parseBoolean("true");
Boolean b = Boolean.valueOf(true);
Boolean b = Boolean.valueOf("true");
(4)是冗余的(1)和(5)是冗余的(2)。除了两个是构造函数,两个是方法。我怀疑从方法而不是构造函数中获得这些功能可能对某些东西有用(工厂?)。