¿Garantiza el lenguaje Java que el instanceof
operador o el getClass()
método aplicado a this
en un constructor siempre se aplica a la clase más profunda en la jerarquía?
Por ejemplo, si quiero limitar las subclases que se permite llamar a un constructor de la superclase, que podría hacer esto:
class A {
A() {
final Class<?> clazz = getClass();
if (clazz != A.class && clazz != B.class && clazz != C.class) {
throw new IllegalStateException();
}
}
}
pero me pregunto si las garantías del lenguaje que va a funcionar o no.
Sí, está garantizado.
Hay un siempre una llamada implícita a super()
como la primera acción del constructor si no se especifica explícitamente una. ( JLS )
La razón de esta restricción se aplica - en lugar de permitir al constructor padre para ser llamado en cualquier momento - es por lo que todas las clases súper están garantizados para ser inicializado, ya sea Object
, o cualquier otro tipo de super. Cada método de instancia de Object
es seguro de usar en este punto; getClass
no es una excepción.
Véase también ¿Por qué este () y super () tiene que ser la primera instrucción de un constructor?