在构造函数中使用“ this instanceof…”或“ getClass()是否安全?

问题描述 投票:2回答:2

Java语言是否保证在构造函数中应用于instanceofgetClass()运算符或this方法始终适用于层次结构中的较深类?

例如,如果我想限制允许从超类调用构造函数的子类,我可以这样做:

class A {
  A() {
    final Class<?> clazz = getClass();
    if (clazz != A.class && clazz != B.class && clazz != C.class) {
      throw new IllegalStateException();
    }
  }
}

但是我想知道这种语言是否保证它会工作。

java instanceof
2个回答
1
投票

是,有保证。

如果未显式指定super(),则构造函数的第一个动作始终是对其进行隐式调用。 (JLS

强制执行此约束的原因-不允许在任何时候调用父构造函数-以便确保所有超类均被初始化,无论是Object还是任何其他超类型。此时,Object的每个实例方法都可以安全使用; getClass也不例外。

另请参阅Why do this() and super() have to be the first statement in a constructor?


0
投票

您的问题本质上是,在哪个对象上称为getClassJLS涵盖如下

关键字this只能在以下情况下使用:

  • 类的构造函数的主体(第8.8.7节)
  • ...

用作主表达式时,关键字this表示一个值,该值是对该对象的引用实例方法或默认方法被调用(第15.12节),或正在构造的对象

© www.soinside.com 2019 - 2024. All rights reserved.