为什么java有很多重复的方法?

时间:2011-04-18 01:50:21

标签: java duplicates primitive-types

我正在玩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()来获取布尔值。有人想要调用一个方法来获取布尔值的布尔值,尽管他可以自己调用变量吗?

有什么意义?

8 个答案:

答案 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)

  1. 有时您需要将字符串解析为原始Boolean.parseBoolean(*String*)
  2. 有时您需要将String解析为Boolean Boolean.valueOf(*String*)
  3. 有时您无需创建新对象。最好避免使用new
  4. 有时您需要布尔对象而不是原始Boolean.valueOf(*boolean*)
  5. 这些不一样。

答案 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的返回类型。该列表实际上是:

  1. Boolean b = new Boolean(true);
  2. Boolean b = new Boolean("true");
  3. boolean b = Boolean.parseBoolean("true");
  4. Boolean b = Boolean.valueOf(true);
  5. Boolean b = Boolean.valueOf("true");
  6. (4)是冗余的(1)和(5)是冗余的(2)。除了两个是构造函数,两个是方法。我怀疑从方法而不是构造函数中获得这些功能可能对某些东西有用(工厂?)。

    java.lang.Boolean