Pregunta

En Java, puedo escribir código como este

Boolean b = true ;

Y funcionará. Ahora tengo un objeto que contiene el valor "verdadero".

¿Cómo funciona? ¿Por qué no tengo que pasar el valor a través de un constructor? Al igual que:

Boolean b = new Boolean( true ) ;

Además, ¿puedo hacer clases personalizadas que pueda instanciar de manera similar? Si es así, ¿cómo se llama así?

Para que pueda hacer algo como esto:

Foobar foobar = "Test" ; 

Y así tener mi propia clase de envoltorio.

Gracias

¿Fue útil?

Solución

No, no puedes hacer lo último.

El primero se llama autoboxing y se introdujo en Java V1.5 para envolverse automático, primitivas en su contraparte de envoltura.

El beneficio del autoboxing podría verse claramente cuando se usa genéricos y/o colecciones:

Del artículo: J2SE 5.0 en pocas palabras

En el "Autoboxing y auto-unboxing de tipos primitivos" muestra que tenemos:

Antes (se agregó autoboxing)

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42)); 
int total = (list.get(0)).intValue();

Después

 ArrayList<Integer> list = new ArrayList<Integer>();
 list.add(0, 42);
 int total = list.get(0);

Como puede ver, el código es más claro.

Solo tenga en cuenta la última nota sobre la documentación:

Entonces, ¿cuándo debe usar AutoBoxing y Unboxing? Úselos solo cuando haya un "desajuste de impedancia" entre los tipos de referencia y las primitivas, por ejemplo, cuando tiene que poner valores numéricos en una colección. No es apropiado usar autoboxing y unboxing para la computación científica u otro código numérico sensible al rendimiento. Un entero no es un sustituto de un int; Autoboxing y Unboxing difuminan la distinción entre tipos primitivos y tipos de referencia, pero no lo eliminan.

Otros consejos

¿Cómo funciona?

Es una característica del compilador. El compilador generará automáticamente la operación de boxeo. Lo que realmente hará es generar

Boolean.valueOf(true);

Porque de esta manera las instancias existentes (inmutables) boolean.true y boolean.false se utilizarán en lugar de crear una nueva.

Es de la misma manera que puedes hacer objetos de cadena como tales:

String s = "foobar"

Es solo una ventaja en Java, de verdad. Tampoco estoy seguro de por qué querrías hacer tu propia clase de envoltorio, teniendo en cuenta que cualquier tipo de datos primitivo ya tiene un envoltorio predefinido ...

Esta característica se agregó a Java 1.5 y se llama Autoboxing. Este tipo de magia disponible solo para valores primitivos y envoltorios correspondientes.

Y no puedes hacerlo tú mismo en Java. Si todavía lo quieres, entonces ve Escala - ¡es genial! A saber, puede usar la función llamada conversiones implícitas. Aquí hay un pequeño ejemplo para su caso:

case class Foobar(value: String)
implicit def convertStringToFoobar(s: String) = Foobar(s)
val foobar: Foobar = "Test";

No, es solo magia del compilador; Los trata como casos especiales (conocidos como autoboxing). Ver EG http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html.

Se llama autoboxing y es básicamente algo algo que el compilador hace por ti. Se agregó solo en Java 5, antes de que tenías que usar new Boolean( true ), o mejor) Boolean.TRUE.

Y no, no puedes tenerlo para tus propias clases, solo se hace para las clases de envoltura primitiva.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top