Коллекция объектов всех классов, которые реализуют определенный интерфейс - PullRequest
1 голос
/ 25 июня 2011

У меня есть интерфейс TestInterface, и различные классы могут реализовывать интерфейс.Можно ли иметь коллекцию всех объектов, которые реализуют интерфейс?Коллекция может быть создана с использованием

LinkedList<TestInterface> store

, где store - это имя коллекции.Но как отследить создание объектов классов, которые реализуют TestInterface.И к тому же где хранить коллекцию?

Ответы [ 3 ]

0 голосов
/ 25 июня 2011

Возможно ли иметь коллекцию всех объектов, которые реализуют интерфейс?

Теоретически да.

В действительности, это будет работать, только если всеэто создает экземпляр объекта и добавляет его в список.И это, вероятно, делает это непрактичным ... если вы не измените способ создания объектов.

  • Один подход использует фабрики, но ничто не мешает некоторому коду, создающему экземпляр, не используя ваштщательно реализованная фабрика.

  • Другой подход заключается в замене интерфейса на абстрактный базовый класс, конструктор (-ы) которого гарантируют, что каждый новый экземпляр будет добавлен в список.Это не может быть подорвано с помощью обычного кода.Однако, если вы используете сериализацию Java-объектов (или аналогичную), вам нужно будет поместить «крючок» в базовый класс, чтобы убедиться, что десериализованные объекты добавлены в список.


Обратите внимание, что коллекция, которая содержит все экземпляры некоторого интерфейса или класса, потенциально является большой утечкой памяти.Вы, вероятно, должны будете что-то с этим сделать;например, используя слабые ссылки.

0 голосов
/ 25 июня 2011

Если вам отчаянно нужно сделать это автоматически, то по принципу вы можете:

  • используйте инструментарий Java, добавив ClassFileTransformer, чтобы гарантировать, что любой класс, реализующий ваш интерфейс, будет переопределен, чтобы его конструкторы автоматически добавляли экземпляры в вашу коллекцию (посмотрите на что-то вроде Bytecode Engineering Library, BCEL, если вам нужно спуститься вниз этот маршрут);
  • возможно, проще, но все еще достаточно много работы: используйте интерфейс инструментов JVM, чтобы написать агента, который может на лету запрашивать кучу экземпляров вашего объекта.

В любом случае, если интерфейс принадлежит вам, то введение соглашения о программировании, согласно которому все экземпляры реализаций этого интерфейса добавляются в коллекцию, определенно проще, если оно более подвержено ошибкам.

0 голосов
/ 25 июня 2011

Не зная, для чего это нужно, трудно сказать.

Но в любом случае, да, вы можете создать коллекцию, но для отслеживания и хранения ссылок на объекты TestInterface вы должны контролировать ихcreation.

Самым простым способом было бы иметь шаблон TestInterfaceFactory (см. AbstractFactory ), это также хорошее место для хранения коллекции store со ссылками на экземпляры.

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