2015-05-10 2 views
-2

Я начал получать обратно в Java и у меня есть общий вопрос об определении конструктора для объекта: Я следую учебник, где он определяет объект HashSet следующим утверждением:определения конструктора подкласса

Set<String> set = new HashSet<String>(list); 

(список приведен список объектов)

И мне было интересно, какая разница, если я использую это заявление:

HashSet<String> set = new HashSet<String>(list); 

спасибо!

+1

http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – Reimeus

+0

Это не подкласс, это реализация интерфейса. –

ответ

0

Это относится к одной из наиболее важных концепций oops, то есть к полиморфизму. Если вместо множества вы используете HashSet, то вы не сможете построить гибкий код. Скажем, если вы хотите передать объект в качестве аргумента методу, то, если вы когда-нибудь используете интерфейс Set, вы можете передать еще одну реализацию, например TreeSet, и этот метод будет работать правильно. Это делает код слабо связанным.

0

Одна из определяющих характеристик структуры коллекций Java состоит в том, что она представляет собой систему типа на основе интерфейса. API в основном определяется интерфейсами, которые могут распространять другие интерфейсы. Базовый интерфейс: Collection.

Таким образом, большинство реализаций коллекции (например, ArrayList, HashSet и т. Д.) Также назначаются переменным или параметрам типа Collection). Это обеспечивает большую выразительность для Рамочной основы.

Большинство реализаций Framework Java Collection имеют конструктор, который принимает параметр типа Collection. Это называется «конструктором преобразования», поскольку он позволяет передавать любую коллекцию в структуре, тип которой расширяет интерфейс Collection (и большинство из них) и получает эту коллекцию, представленную как коллекцию вновь созданного типа.

Другими словами:

List<String> list1 = Arrays.asList(new String[] { "one", "two", "three" }); 
HashSet<String> set1 = new HashSet<>(list1); 

Переменная set1 будет в конечном итоге, содержащий ссылку на HashSet например, содержащей все объекты, которые также в List например list1. Конструктор преобразования, по сути, преобразовал представление ваших данных из списка в HashSet.

По возможности, как правило, лучше всего использовать интерфейс объекта как его тип, а не его тип реализации. Это дает вам большую гибкость. Поэтому «List myList = ...» предпочтительнее «ArrayList myList = ...».

Смежные вопросы