2012-07-16 16 views
14

Según http://groovy.codehaus.org/Things+you+can+do+but+better+leave+undone¿Por qué .class maravilloso devolver un valor diferente que .getClass()

  1. Acceso a un tipo de objeto como una propiedad

Usando .class en lugar de .getClass() está bien - siempre que sepa exactamente qué tipo de objeto tiene. Pero entonces no necesita eso en todo. De lo contrario, corre el riesgo de obtener un valor nulo u otra cosa, , pero no la clase del objeto.

a = [:] println a.class.simpleName // NullPointerException, porque a.class es nulo.

¿Alguien puede explicar por qué es esto? ¿Por qué .class retorno algo diferente a getClass()

Respuesta

16

Porque cuando a es un mapa, a.class es la misma en Groovy como a.get("class"). Como puede ver en el ejemplo en los documentos, esto devolverá nulo. Es por eso que la regla tiende a usar getClass a menos que esté absolutamente seguro de que la variable no será un mapa

+0

Ah, ya veo. Por lo tanto, es específico para el mapa (y cualquier cosa similar). –

5

Un ejemplo que no es un mapa es la diferencia entre la clase de un tipo y la clase de una instancia. La .class y .getClass() de una instancia son su tipo, con algunas excepciones, p. Ej. mapas. La clase de un tipo, es el tipo. El .getClass() de un tipo es java.lang.Class

Por ejemplo:

def a = Integer.getClass() 
def b = Integer.class 
def c = 1.getClass() 
def d = 1.class  

println a 
println b 
println c 
println d 

dará la salida:

class java.lang.Class 
class java.lang.Integer 
class java.lang.Integer 
class java.lang.Integer 
Cuestiones relacionadas