2011-02-03 13 views
9

en Java, que puede escribir código como este¿Cómo se crea una instancia de la clase de envoltura Java Boolean?

Boolean b = true ; 

y funcionará. Ahora tengo un objeto que mantiene el valor "verdadero".

¿Cómo funciona eso? ¿Por qué no tengo que pasar el valor a través de un constructor? De la misma manera:

Boolean b = new Boolean(true) ; 

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

Para que yo pueda hacer algo como esto:

Foobar foobar = "Test" ; 

y así tener mi propia clase de contenedor.

Gracias

+0

Esto se conoce como autoboxing. Buscar en Google 'java autoboxing' proporcionará mucha información sobre lo que está presenciando. –

+2

La última parte necesita más maquinaria de la que proporciona Java. En scala, por ejemplo, esto probablemente podría hacerse con implicits – svrist

+0

Gracias a todos, nunca escuché el término "autoboxing" antes. – CrazyPenguin

Respuesta

13

No, no puedes hacer esto último.

El primero se llama autoboxing y se introdujo en Java v1.5 para envolver automáticamente, primitivas en su contraparte de envoltura.

El beneficio de autoboxing ha podido ser claramente ha visto cuando se utilizan los genéricos y/o colecciones:

Desde el artículo: J2SE 5.0 in a Nutshell

En el "Autoboxing y Auto-Contenido de la caja de tipos primitivos" muestra nos tener:

Antes (se añadió autoboxing)

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

Después de

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

Como se ve, el código es más clara.

Sólo tener en cuenta la última nota en la documentación:

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

1

Es la misma manera que usted puede hacer que los objetos String como tal:

String s = "foobar" 

Es sólo un beneficio en Java, de verdad. No estoy seguro de por qué querría crear su propia clase de contenedor, ya que cualquier tipo de datos primitivos ya tiene un contenedor predefinido ...

+0

No tengo una necesidad práctica, pero me di cuenta de que no sé cómo funciona, y sin conocer la frase "autoboxing" había algunas búsquedas de Google infructuosas – CrazyPenguin

0

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

Y no, no puedes tenerlo para tus propias clases, solo se hace para las clases primitivas.

3

¿Cómo funciona eso?

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

Boolean.valueOf(true); 

Debido a que de esta manera los (inmutables) y las instancias existentes Boolean.TRUE Boolean.FALSE serán utilizados en lugar de crear una nueva.

1

Esta característica se ha agregado a Java 1.5 y se llama Autoboxing. Este tipo de magia solo está disponible para valores primitivos y envolturas correspondientes.

Y no puede hacerlo usted mismo en Java. Si todavía lo quieres, entonces ve por Scala - ¡es genial! A saber, puede usar la característica llamada implicit conversions. 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"; 
Cuestiones relacionadas