2017-02-17 30 views
0

В качестве примера предположим, что я делаю свой собственный класс реализации Collection<E>, который использует базовый List<E> для хранения элементов. Как я могу позволить пользователю/вызывающему пользователю указать, какой тип базового списка использовать без их ссылки на него? Если они предоставят экземпляр списка через параметр конструктора, они оставят ссылку на него и смогут ее модифицировать. Если они передают объект Class<List<E>>, это означает, что я должен сделать экземпляр из него (с Class.newInstance() или Constructor.newInstance(), где типы параметров конструктора, которые я выбираю, могут не существовать), которые, как представляется, обычно не идеальны и непредсказуемы. И я не думаю, что могу зависеть от Object.clone().Как я могу позволить вызывающему абоненту указать базовую реализацию для использования в моем классе, если у них нет ссылки на фактический экземпляр? (Java)

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

+0

Вы на Java 8? По-видимому, Java 8 разрешает это, позволяя пользователю проходить в «Поставщике» указанного типа, например. 'Collectors.toCollection (ArrayList :: новый)'. –

+0

Почему для пользователя/вызывающего пользователя важно, какую базовую реализацию использует ваш API? Если требуется создание разных методов, каждый из которых имеет другую реализацию. Целью интерфейсов является обеспечение того, чтобы пользователю не нужно было знать основную реализацию. – anacron

+0

@anacron В частности, в моем случае я создаю класс сервера, который принимает параметр «Исполнитель» как параметр конструктора, поэтому клиент/вызывающий может указывать, как следует запускать потоки сервера. – sep1256

ответ

0

Если вы знаете, какие аргументы необходимы для конструктора указанного класса, то клиент может пройти через конструктору: (Class<List<E>>, String arg1, int arg2), и если вы этого не сделаете, просто передать (Class<List<E>>, Object... args) где args есть все необходимые аргументы для конструктор. Если они вводят что-то недействительное, оно немедленно выдаст исключение.