Как я могу ограничить создание анонимного подкласса (Java) - PullRequest
2 голосов
/ 22 апреля 2010

Извините, вопрос не был правильно задан мной ранее. Я пытаюсь реализовать Factory Pattern. Лучший пример: это абстрактный класс Human с функцией create. На основе аргументов, переданных для создания, он решает, возвращать ли экземпляр своего подкласса Man или экземпляр подкласса Woman. Итак, вы называете create с помощью: Human john = Human.create("Man"); Подклассы Мужчина и Женщина унаследованы от абстрактного класса Human и определены в том же файле, что и Human. Я не хочу, чтобы его можно было расширить на: Human lisa = new Human("woman") {}; Из основной программы. Спасибо!

EDIT:

Спасибо за помощь! Решение, которое я наконец-то использовал, состояло в том, чтобы сделать класс Human общедоступным и создать его функцию. Классы Human конструктор и Man и Woman объявлены защищенными от пакетов.

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

Не используйте спецификатор видимости в объявлении класса для A, и это будет класс доступа к пакету.

Изменить, чтобы отразить изменение в вопросе:

Вариант 1: Сделайте конструкторы для пакета Human закрытыми. При этом любой класс, который пытается расширить Human вне пакета, потерпит неудачу, потому что он не сможет вызвать конструктор суперкласса.

Вариант 2: Придерживайтесь моего первоначального предложения о пакете частного класса и используйте вместо него общедоступный заводской класс.

0 голосов
/ 22 апреля 2010

Это зависит от того, что вы подразумеваете под невозможным. Если вы хотите, чтобы он применялся статически, единственный способ сделать это - получить доступ к пакету классов, но это не ограничивает анонимные классы, а ограничивает именованные классы. Если вы хотите применить его во время выполнения, вы можете сделать это в конструкторе абстрактного класса

 if (this.getClass().isAnonymousClass() && !this.getClass().getName().startsWith(packageName)) {
     throw new IllegalStateException("This class cannot be used as an anonymous inner class");
  }
...