それはコンストラクタで「このinstanceofは...」または「のgetClass()」を使用するように安全ですか?

ジュリアン・ロイヤー:

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例外ではありません。

参照して、コンストラクタの最初のステートメントでなければならない)、なぜ(これを行う)、スーパー(?

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=458702&siteId=1