2011-07-13 93 views
10

一个简单的设计问题。为什么toBinaryString不是Integer类中的实例方法?

示例代码:

Integer int1 = new Integer(20);  
    System.out.println(Integer.toBinaryString(int1)); 

为什么JDK的设计是不是像下面这样?所以,toBinaryString函数返回的期望结果?

System.out.println(int1.toBinaryString()); 

除了对静态函数的广泛可用性,是什么等原因这种设计方法?他们是否使用任何特定的设计模式?如果是的话,哪种模式?

回答

9

您的示例代码将创建一个Integer的实例,然后对其进行拆箱。有没有必要的:

int int1 = 20; 
String binary = Integer.toBinaryString(int1); 

如果它是一个实例方法,你会被迫创建的Integer一个实例,但只能到int转换成它的二进制表示,这将是烦人。

换句话说:避免不必要地创建对象。

+0

为了避免*明确*不必要地创建对象,不需要?在这两种情况下,自动装箱最终都会创建基本相同的字节码。(现在,热点可能会完全消除对象的创建,但同样适用于这两种情况)。或者我错过了什么? –

+0

@ jon-skeet让我们说'int'类型不存在。那么这个设计模式背后的原因是什么? –

+1

Andrzej:不,不会有任何自动装箱,因为参数类型为“int”,而不是“Integer”。 –

15

这是因为你不能有两个同名的方法,一个是静态的,一个是实例。为同样的功能再次使用两个不同的方法名称会令人困惑。

在静态方法把似乎更符合逻辑的,因为在这种情况下,你就不会得到它的二进制表示之前“包装”一个int为整数,它符合两国的目的(二进制字符串intInteger) 。

+0

我知道了。我的问题是为什么jdk是这样设计的。 –

+0

我已经回答了;这是因为你不必将'int'包装到'Integer'中,也可以防止类中有两个方法(一个是静态的而另一个不是)做同样的事情。 –

+0

+1我怀疑这是答案 - 因为'int'不是一个对象,但是自动装箱可以让你在将*传递给方法时(但不是在调用方法时)假装它是一个。 'Integer.toBinaryString(42)'编译,但'42.toBinaryString()'不。 –

6

在添加此方法后,在JDK1.0.2中,没有自动装箱,JVM比现在慢得多。我想,使用这种静态方法可以轻松地将int和Integer转换为二进制字符串,而不必为int转换为二进制文件创建新的Integer实例。

0

int,char,double ...这些都是默认数据类型,它们不是对象。方法应该是Object not datatype的一部分。

这样的静态方法比实例方法更高效。

相关问题