Как я могу сделать Внутренний Класс неосуществимым? - PullRequest
1 голос
/ 02 мая 2010

Я хочу статический внутренний класс, который не может быть создан даже внешним классом. Прямо сейчас у меня есть документация, которая говорит: «Пожалуйста, не создавайте экземпляр этого объекта» Могу ли я дать лучший сигнал?

Ответы [ 3 ]

8 голосов
/ 02 мая 2010

Мне нужен статический внутренний класс, который не может быть создан даже внешним классом.

Я предполагаю, что «внешний класс» действительно означает включающий класс.

  • Если вы не хотите ограничивать включающий класс, то создание единственного конструктора внутреннего класса private даст желаемый эффект.

  • Если вы также хотите ограничить включающий класс, ответ будет невозможен. Если вы объявите конструктор внутренних классов как private, включающий класс все равно сможет получить к нему доступ и создать его экземпляр. Если вы объявите внутренний класс как abstract, включающий класс все еще может объявить подкласс и создать экземпляр этого класса.

Однако я хотел бы предположить, что это (то есть предотвращение всех создания экземпляров внутреннего класса) является бессмысленным упражнением. Любые нестатические объявления во внутреннем классе не могут быть использованы каким-либо образом, и любые статические объявления также могут быть объявлены во включающем классе.

Кроме того, все, что вы делаете для «предотвращения» создания экземплярами внутреннего класса включающего класса, можно обойти, отредактировав исходный файл, содержащий два класса. И даже класс с конструктором private может быть создан с помощью отражения, если вы поступите правильно.

0 голосов
/ 22 декабря 2013

Сначала создайте следующее в отдельном файле:

public Do_Not_Instantiate_This_Class extends Exception {
    /*
    *Please Do Not Instantiate This Class
    */
    private static final long serialVersionUID = 1L;
}

Затем создайте в своем внутреннем классе конструктор, который будет

private final innerClass() throws Do_Not_Instantiate_This_Class {
    throw(new Do_Not_Instantiate_This_Class());
}

Таким образом, никакие классы, кроме внешнего, не могут «видеть» конструктор, и внешний класс не может использовать конструктор без объявления try / catch или throws для Do_Not_Instantiate_This_Class, чтобы даже компилировать, и он всегда будет ловить или бросить его во время выполнения. Не совсем оптимально, но я думаю, что это сделано так, как вы хотите.

0 голосов
/ 02 мая 2010

Перестройте его и сделайте его анонимным.

...