Groovy - Auto Boxing
El auto boxing en Java no es realmente soportado de forma nativa, el auto boxing introducido en Java 5 en realidad es un workaround que utiliza un precompilador para hacer el casteo a objetos por nosotros, por ejemplo si hacemos la siguiente sentencia:
List&t;Integer> list = new ArrayList &t;Integer> ();
list.add (1);
int i = list.get(0);
Eso esto traducido por el precompilador de Java 5 como:
list.add(new Integer(1));
int i = (Integer)list.get(0);
En Groovy, todo objeto nativo es realmente un objeto y se trata como tal, veamos un ejemplo:
void autoboxing () {
println("\nFull object primitives - autoboxing")
(1..3).each { print "*** " }
println("")
def i = 2 // define an integer
println i.class
println i.abs()
def d = 2.2
println d.class
} // autoboxing
Salida:
Full object primitives - autoboxing
*** *** ***
class java.lang.Integer
2
class java.math.BigDecimal
Párrafo aparte, si alguno se pregunta porque en Java no todo es un objeto y hay una clara diferencia entre objetos primitivos y Objetos, inclusive en el pase por parametros, como se a comentado en post pasados. Contrario a Groovy o el mismo .Net, los ingenieros de Sun alegan que en el momento de hacer el lenguaje la decisión sonaba coherente por un asunto de perfomance, pues lo objetos se comportan de una forma mas pesada que un simple dato primitivo, cosa que creo ya no aplica y por eso lenguajes mas modernos, que sin lugar a duda se basan en Java así como Java se baso en C++, evitan ese error de diseño.
El auto boxing en Java no es realmente soportado de forma nativa, el auto boxing introducido en Java 5 en realidad es un workaround que utiliza un precompilador para hacer el casteo a objetos por nosotros, por ejemplo si hacemos la siguiente sentencia:
List&t;Integer> list = new ArrayList &t;Integer> ();
list.add (1);
int i = list.get(0);
Eso esto traducido por el precompilador de Java 5 como:
list.add(new Integer(1));
int i = (Integer)list.get(0);
En Groovy, todo objeto nativo es realmente un objeto y se trata como tal, veamos un ejemplo:
void autoboxing () {
println("\nFull object primitives - autoboxing")
(1..3).each { print "*** " }
println("")
def i = 2 // define an integer
println i.class
println i.abs()
def d = 2.2
println d.class
} // autoboxing
Salida:
Full object primitives - autoboxing
*** *** ***
class java.lang.Integer
2
class java.math.BigDecimal
Párrafo aparte, si alguno se pregunta porque en Java no todo es un objeto y hay una clara diferencia entre objetos primitivos y Objetos, inclusive en el pase por parametros, como se a comentado en post pasados. Contrario a Groovy o el mismo .Net, los ingenieros de Sun alegan que en el momento de hacer el lenguaje la decisión sonaba coherente por un asunto de perfomance, pues lo objetos se comportan de una forma mas pesada que un simple dato primitivo, cosa que creo ya no aplica y por eso lenguajes mas modernos, que sin lugar a duda se basan en Java así como Java se baso en C++, evitan ese error de diseño.
Comentarios