Como ya vimos en nuestro artículo donde explicábamos clases y objetos, normalmente para realizar una instanciación (acción de crear un objeto a partir de una clase) sobre una clase en Java necesitamos definirla previamente.

Pero si por ejemplo usamos una de las clases más famosas de Java, la que se encarga del manejo de cadenas de texto, la clase String. Podemos observar como no necesitamos realizar la definición/creación de dicha clase para utilizarla. Si además miramos en la parte superior de la clase en la que utilizamos esta clase String, podemos ver que además no tenemos imports.

¿No os parece extraño? En mi cabeza empieza a surgir la curiosidad por adentrarme dentro de dicha clase y poder diseccionarla al completo. ¿Qué contendrá esta clase? Esa curiosidad, me hace intentar acceder a ella, CONTROL + CLICK IZQ open declaration y compruebo que no me deja entrar en el interior de la clase, no puedo acceder a ella pero si usarla.

Si utilizo CONTROL + SHIFT + R nos aparece el buscador de clases de Eclipse y busco string, puedo comprobar que la clase no aparece, es decir, la puedo utilizar pero no tengo visibilidad debido a que no la tengo en mi package.

Si nos metemos en la web de la API de java y buscamos la clase String o bien desde el propio google (buscando por ejemplo: string java class) llegaremos a la web de la API de java. Os adjunto el enlace: https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

Si indagamos un poco desde la API y buscamos la clase String, podremos encontrar que justo debajo del nombre de la clase se nos indica que pertenece al paquete java.lang.

Dentro de la API de Java, además de ver el package al que pertenece, podemos ver un listado con todos los constructores y métodos junto a su descripción de la clase. Esta API será la manera más rápida y práctica de conocer tantos los métodos y los constructores de una clase (en nuestro caso la clase String) sobre la que por el momento podemos trabajar pero no acceder al interior de esta clase interior.

Otra manera de “ayudarnos” para ver los métodos de una clase sería ayudarnos del propio intelligence, el asistente de ayuda de Eclipse (que podemos ejecutar con CONTROL + ESPACIO) aquí por ejemplo vemos los métodos de la clase String. Aunque la manera más recomendable siempre será la API de Java.

Me siguen surgiendo preguntas: ¿Puedo trabajar con ella pero no ver su contenido? ¿No os parece extraño? ¿Cual es el motivo?

El motivo por el que nos encontramos con esta situación, es porque este tipo de clases son inmutables (fijas). Y esto se produce porque tienen un final en su declaración. y por tanto, no se pueden modificar. Si operamos con la clase String, podemos trabajar perfectamente con ella pero los objetos originales son inalterables. Aunque todo esto puede parecer una desventaja (en parte lo es) tiene como ventaja que su uso al ser implementado es mucho más eficiente.

¿Qué es un package/paquete?

Un package es un contenedor que nos permitirá agrupar distintas clases, interfaces, tipos enumerados y anotaciones. Agrupándolas en un directorio dentro de la estructura jerárquica de nuestro proyecto. En nuestro caso en concreto el package (java.lang) del que estamos hablando contiene la clase String.

Beneficios de los packages/paquetes:

Los beneficios de trabajar con packages son:

  • Mayores niveles de seguridad, ya que se crean distintos niveles de acceso. Lo que por ejemplo a nosotros ahora mismos no nos permiten acceder a la clase String pero si usarla.
  • Agrupamiento de clases que aunque no es necesario suelen tener algunas características comunes. En nuestro caso el package java.lang engloba más clases, lo vemos más detalladamente un poco más abajo.
  • Son ideales para no tener que picar otra vez código que ya existe permitiéndonos el reutilizar el código. Realmente sobre la clase String no hemos picado ni una línea de código, podría ser un ejemplo claro de reutilización.
  • Pueden existir varias clases con el mismo nombre pero no en el mismo paquete. Evitamos las colisiones de clases con el mismo nombre siempre que el fully qualified class name sea único (nombre de la clase junto al del paquete por ejemplo en el caso de String java.lang.String).
  • Mejor mantenimiento del código si se agrupa en un paquete. Permitiendo la reusabilidad y en caso de ser pequeño además aportando una fácil mantenibilidad.

Entendiendo el package Java.lang

Antes hemos estado hablando de que no tenemos que realizar import ni crear la clase (ya que en este caso en particular ya viene predefinida en el package java.lang) y Java automáticamente al crear un programa nos auto carga el paquete java.lang. Un paquete de clases que contiene/agrupa muchas clases que se suponen que son básicas y que se utilizan bastante a menudo (por no decir casi siempre) en el desarrollo del software. Y en este caso se crea con el fin de evitar multitud de imports, tener un código más reducido, que sea más sencillo el realizar tareas bastantes comunes, etc.

Como acabamos de ver la clase String además de otras clases como String, System, etc. pertenecen al package java.lang que se auto importa automáticamente al crear un programa con Java.

Por tanto, no tendremos que realizar nada tan solo utilizar la clase String. Si nos fijamos en la imagen, podemos ver que este package además también está formado por otras clases como por ejemplo System (clase que muestra mensajes por pantalla y con la que ya nos hemos familiarizado anteriormente), la Math (para realizar operaciones matemáticas), etc.

Adentrandonos en una clase inmutable

Vamos a conseguir adentrarnos dentro de una clase inmutable como es la clase String. Para ello, necesitamos primeramente mirar si tenemos el JDK instalado.

En el caso de no ser así, es necesario instalarlo. Para ello, vamos a https://www.oracle.com/technetwork/es/java/javase/downloads/index.html y descargamos una versión de JDK, en mi caso jdk1.8.0_251_x64, aunque en el vuestro no tiene por qué ser la misma ya que van surgiendo nuestras necesidades de seguridad o se les añaden funciones nuevas y las antiguas se van quedando atrás (obsoletas).

También debemos de comprobar que tenemos agregado el JDK a Eclipse (aunque lo tengamos instalado en el sistema), si no está asociado no nos funcionaría. Para ello agregamos mediante a Add… la ruta del sistema de nuestro JDK que acabamos de instalar (o en el caso de ya tenerlo instalado simplemente lo asociamos).

Una vez cumplidas todas las condiciones, tenemos un JDK instalado y asociado a Eclipse seguimos. Vamos a buscar el archivo src.zip o src (sin extensión), lo vamos a copiar y a mover a nuestro escritorio para posteriormente añadirlo a nuestro proyecto. Con el fin de evitar el mensaje que anteriormente hemos visto en Eclipse en el que se nos indicaba que no podíamos acceder a la clase al no encontrarse con ella “Source not found”.

Para ello, vamos a buscar en dos rutas, normalmente si no se encuentra en una de ella se encuentra en la siguiente. Yo os podré sobre las que busco yo en particular, aunque las vuestras me imagino que serán muy similares cambiando el usuario/username (David en mi caso) y poco más.

Por tanto y por poner un ejemplo si la ruta es: C:\Users\UserName\AppData\ como mi usuario es David, la ruta sería: C:\Users\David\AppData\

Las rutas son donde se puede suele encontrar el src.zip son:

  • C:\Users\UserName\AppData\LocalLow\Oracle\Java\jdk1.8.0_251_x64

Como podemos observar en la imagen, podemos comprobar que en mi caso en particular no lo encontramos aquí. Que no cunda el panico que seguro que está en la segunda ruta.

  • C:\Program Files\Java\jdk1.8.0_251

Aunque existe una manera de averiguar la ruta en la que se encuentra el paquete exactamente en nuestro sistema. Para ello, si no nos aparece el explorador de paquetes, vamos a: Windows > Show View > Other y buscamos Package Explorer para mostrarlo.

Si nos adentramos en rt.jar vemos la ruta sobre la que acabamos de trabajar hace un segundo.

Si la desplegamos podemos ver que dentro encontramos el package java.lang:

Si desplegamos este paquete, vemos que tenemos podemos encontrar nuestra clase String, junto al resto de clases que pertenecen a dicho paquete. E incluso continuar adéntranos para ver sus métodos y constructores.

Y como ya hemos dicho, copiamos el fichero src.zip en nuestro escritorio para que sea más sencillo de añadir a nuestro proyecto. ¿Que contiene este zip? Pues nada más y nada menos que el conjunto de las clases que vienen por defecto con java. Aunque seguimos sin poder adentrarnos en ella (por poco tiempo).

Para cargarlas en el sistema simplemente volvemos al punto inicial y pulsamos sobre Change Attached Source

Y si finalmente vamos de nuevo a la clase String (es necesario cerrar la pestaña previamente) y si no nos funciona os recomiendo primero meteros en la clase System (CONTROL + click sobre la clase) y luego abrir la String.

Y finalmente, de una vez por todas, podemos ver como ya tenemos nuestra clase String aquí.

Y aquí podemos ver el motivo por el que dicha clase es inmutable, que definieron la clase como final en su creación.

Espero que os haya servido para conocer cómo trabaja la clase String, internamente Java y sobretodo empezaros a familiarizar con las clases inmutables. En próximas clases explicaremos como crear clases inmutables y más cosas. ¡Un saludo javer@s!