2016-12-08 5 views
0

Я учусь использовать библиотеку guava и ссылаюсь на this Я вижу использование строителя для создания экземпляра неизменяемой карты. Как конструктор построителя может создать экземпляр абстрактного класса?Как создатель ImmutableMap может создать экземпляр абстрактного класса?

static final ImmutableMap<String, Integer> WORD_TO_INT = 
     new ImmutableMap.Builder<String, Integer>() 
      .put("one", 1) 
      .put("two", 2) 
      .put("three", 3) 
      .build(); 

ответ

0

ImmutableMap (Guava: Google Core Libraries for Java 21.0-SNAPSHOT API) утверждает, что это «Map, содержимое которого никогда не изменится, со многими другими важными свойствами, указанными в ImmutableCollection».

"Другое важное подробное на ImmutableCollection свойство" включает в себя следующую гарантии:

Каждые делают следующие гарантии:

  • Мелкой неизменность. Элементы никогда не могут быть добавлены, удалены или заменены в этой коллекции. Это более надежная гарантия, чем у Collections.unmodifiableCollection(java.util.Collection<? extends T>), содержимое которой изменяется, когда изменяется обернутая коллекция.
  • Null-враждебность. Эта коллекция никогда не будет содержать нулевой элемент.
  • Детерминированная итерация. Порядок итераций всегда хорошо определен, в зависимости от того, как была создана коллекция (подробнее см. Соответствующий заводский метод). Просмотр таких коллекций, как Multiset.elementSet(), повторяется в том же порядке, что и родительский, за исключением случаев, отмеченных.
  • Безопасность резьбы. Безопасно получать доступ к этой коллекции одновременно из нескольких потоков.
  • Целостность. Этот тип не может быть подклассифицирован за пределами этого пакета (что позволит нарушить эти гарантии).

Последней гарантия, integrety, намекает на то, что внутренне Гуава имеет конкретные реализации (неабстрактные) из ImmutableMap и других неизменных объектов, это то, что на самом деле возвращаемые эти строителями.

Кроме того, источник открыт; вы можете найти для себя как строитель может это сделать (например, вы можете начать here).

+1

Благодарим вас за четкое объяснение. Да, build(), похоже, создает экземпляр RegularImmutableMap. – learningtocode

2

Я не, то Builder создает реализацию в ImmutableMap (класс, extendsImmutableMap).

Чтобы четко понять, запустите here перед тем, как работать с Guava.

Обновление: см. Комментарий от @Louis Wasserman. Действительно важный комментарий.

+0

Спасибо за ссылку и подтверждаю, что она не делает. Документация didnot указывает, что она была подклассифицирована или какой тип подкласса он будет строить. Отсюда мой вопрос. – learningtocode

+0

Что касается пользователя, это не имеет значения, и нет никакой гарантии, что эта реализация изменится позже. Это точка фабричной модели. –

0

Это не конструктор класса строителя, который возвращает экземпляр неизменяемой карты.

Вы сначала создать строитель по телефону new ImmutableMap.Builder<String, Integer>(), а затем вы вызываете методы в цепочке на этом ImmutableMap.Builder, например - в три раза метод put, а затем метод build.

Метод build - это то, что называется последним, и именно это создает и возвращает экземпляр ImmutableMap.

«Трюк» здесь является то, что put метод ImmutableMap.Builder возвращает сам строитель (он имеет заявление return this; в конце), так что вы можете цепной метод требует, как это.

И действительно, метод build возвращает экземпляр подкласса ImmutableMap, потому что класс ImmutableMap является абстрактным, поэтому он не может быть непосредственно экземпляр.

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