Identificación de objetos
En ocasiones puede ser necesario identificar en tiempo de ejecución el
tipo de objeto con el que estamos tratando. Debido a las capacidades de
polimorfismo de Java, cuando tenemos una referencia a un objeto puede que
sólo sepamos que dicho objeto es una instancia de una clase o de cualquiera
de sus derivadas. Y en ocasiones puede ser necesario saber de qué clase
específica es dicho objeto.
Clase Class
Las instancias de Class contienen
información sobre cada una de las clases (ojo: clases, no instancias) de
nuestro programa. Al ejecutarse un programa, la máquina virtual de Java crea
una instancia de Class por cada clase que vayamos a utilizar, por lo que no
tendremos nunca que inicializar una. En ese cas
- Class Class.forName(String)
- Devuelve la instancia de Class correspondiente al objeto cuyo nombre
coincide con la etiqueta pasada como parámetro.
- String c.getName()
- Siendo c una instancia de Class, devuelve el nombre de la clase que
representa. Es la inversa del anterior.
Gracias al método getClass() que posee
Object (y, por tanto, todos sus descendientes),
podremos obtener el tipo de una referencia y por tanto, su nombre. Este método
es útil para comprobar si dos referencias son del mismo tipo.
Operador instanceof
Hay otra manera de lo más sencilla de identificar el tipo de un objeto:
Identificacion.java
public class Identificacion {
public static void main(String[] args) {
Object o = new String("Hola");
if (o instanceof String)
System.out.println("Es una cadena")
else
System.out.println("No es una cadena");
}
}
Veremos que nos dice que, efectivamente, es una cadena. Si inicializaramos
o a cualquier cosa que no fuera una cadena nos
diría que no lo es. ¿Que no me creéis? Pues haced la prueba, haced la prueba.
Como se puede ver fácilmente, este segundo método es mucho más sencillo y
es el que usaremos habitualmente. ¿Y para qué el primero? Bueno, es posible que
en ocasiones necesitemos saber si existe una determinada clase que no pertenece
a la librería estándar y puede, por tanto, no existir, por lo que no podríamos
emplear instanceof.