ジュリアン・ロイヤー:
Java言語の保証を行うinstanceof
オペレータまたはgetClass()
に適用されるメソッドthis
、コンストラクタでは、常に階層内のより深いクラスに適用されますか?
私はスーパークラスからのコンストラクタを呼び出すことが許可されているサブクラスを制限したい場合たとえば、私はこれを行うことができます:
class A {
A() {
final Class<?> clazz = getClass();
if (clazz != A.class && clazz != B.class && clazz != C.class) {
throw new IllegalStateException();
}
}
}
私はそれが仕事をしたりしないこと言語を保証するかどうかを疑問に思います。
マイケル:
はい、それが保証されています。
常に暗黙の呼び出しがありsuper()
、ユーザーが明示的に指定しない場合は、コンストラクタの最初のアクションとしては。(JLS)
その理由は、この制約が適用されます-むしろ親コンストラクタが任意の時点で呼び出すことができるようにするよりも、 -すべてのスーパークラスはそれが可能かどうか、初期化されることが保証されているようであるObject
、または任意の他のスーパータイプ。すべてのインスタンスメソッドはObject
、この時点で使用しても安全です。getClass
例外ではありません。