Безопасно ли использовать «this instanceof…» или «getClass ()» в конструкторе? - PullRequest
3 голосов
/ 27 января 2020

Гарантирует ли язык Java, что оператор instanceof или метод getClass(), примененный к this в конструкторе, всегда применяются к более глубокому классу в иерархии?

Например, если Я хочу ограничить подклассы, которым разрешено вызывать конструктор из суперкласса, я мог бы сделать это:

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

, но мне интересно, гарантирует ли язык, что он будет работать или нет.

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Да, это гарантировано.

Всегда существует неявный вызов super() в качестве первого действия конструктора, если вы не указали его явно. ( JLS )

Причина применения этого ограничения - вместо того, чтобы разрешать вызов родительского конструктора в любой точке - заключается в том, что все суперклассы гарантированно инициализируются, будь то Object или любой другой супер тип. Каждый метод экземпляра Object безопасен для использования в этой точке; getClass не является исключением.

См. Также Почему this () и super () должны быть первым оператором в конструкторе?

2 голосов
/ 27 января 2020

Ваш вопрос по существу: , на каком объекте getClass вызывается? JLS Обложка выглядит следующим образом

ключевое слово это может использоваться только в следующих контекстах:

  • тело конструктора класса (§8.8.7)
  • ...

При использовании в качестве основного выражения ключевое слово this обозначает значение, которое является ссылкой на объект, для которого экземпляр Метод или метод по умолчанию был вызван (§15.12), или строящемуся объекту .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...