2011-07-13 12 views
10

Una pregunta de diseño simple.¿Por qué toBinaryString no es un método de instancia en la clase Integer?

Código de ejemplo:

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

Por qué JDK no es algo como lo siguiente? entonces, la función toBinaryString devuelve el resultado deseado?

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

Aparte de gran facilidad de uso de una función estática, ¿cuáles son las otras razones de este enfoque de diseño? ¿Están usando algún patrón de diseño particular? Si es entonces, ¿qué patrón?

Respuesta

9

Su código de ejemplo crea una instancia de Integer y luego la desagrupa. No hay necesidad de que:

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

Si se tratara de un método de instancia, estaría obligado para crear una instancia de Integer exclusivamente para convertir un int a su representación binaria, lo que sería molesto.

En otras palabras: para evitar crear objetos innecesariamente.

+0

Para evitar * explícitamente * crear objetos innecesariamente, ¿no? Autoboxing terminará creando códigos de bytes esencialmente idénticos en cualquier caso.(Ahora, Hotspot podría eludir por completo la creación del objeto, pero de nuevo se aplicaría a ambos casos por igual). ¿O me estoy perdiendo algo? –

+0

@ jon-skeet digamos que el tipo 'int' no existe. Entonces, ¿cuál sería la razón detrás de este patrón de diseño? –

+1

Andrzej: No, no habrá ningún autoboxing, porque el parámetro escribe 'int', no' Integer'. –

15

Esto se debe a que no puede tener dos métodos con el mismo nombre, uno estático y una instancia. Tener dos nombres de método diferentes para la misma funcionalidad nuevamente habría sido confuso.

Poner en un método estático parecía más lógico ya que en ese caso no tendría que "envolver" un int en un entero antes de conseguir su representación binaria y que sirve tanto a los fines (cadena binaria de int y para Integer) .

+0

Lo sé. Mi pregunta es por qué jdk está diseñado de esta manera. –

+0

Ya respondí eso; es así porque no tiene que ajustar un 'int' a un' Entero' y también para evitar tener dos métodos en la clase (uno estático y otro no) haciendo lo mismo. –

+0

+1 Sospecho que esta es la respuesta, porque 'int' no es un objeto, pero el autoboxing le permite pretender que es uno cuando * pasó * a un método (pero no cuando se invoca un método en él). 'Integer.toBinaryString (42)' compila, pero '42.toBinaryString()' no. –

6

Atrás cuando se agregó este método, en JDK1.0.2, no había autoboxing, y las JVM eran mucho más lentas que ahora. Me imagino que tener este método estático permite convertir fácilmente tanto un int como un entero en una cadena binaria, y sin tener que crear una nueva instancia de enteros solo para la conversión de un int a binario.

0

int, char, double ... estos son tipos de datos predeterminados, estos no son el objeto. El método debe ser parte de un tipo de datos Object not not.

Dicho método estático es más eficiente que el método de instancia.

Cuestiones relacionadas