Я ответил на вопрос относительно ImmutableMap
. Я предложил использовать шаблон Proxy.
Проблема в том, что Map
содержит метод put
, который выдает UnsupportedOperationException
. Замена других экземпляров Map
на ImmutableMap
нарушит принцип замены Лискова. Мало того, необходимость объявлять put
и putAll
[нарушает принцип разделения интерфейсов]
Технически нет возможности заменить экземпляр Map
экземпляром ImmutableMap
, поскольку Map
— это просто интерфейс. Итак, мой вопрос:
Будет ли создание ImmutableMap
с использованием интерфейса Map
считаться нарушением LSP, поскольку Map
содержит методы put
и putAll
? Не будет ли реализация Map
считаться запахом кода «Альтернативные классы с разными интерфейсами»? Как можно создать ImmutableMap
, который соблюдает LSP, но не содержит запахов кода?
Map.put
иMap.putAll
(а такжеremove
иclear
) определены как необязательные операции. Также в документации по интерфейсу указана возможность выбрасыванияUnsupportedOperationException
из реализующих классов. - person Mick Mnemonic   schedule 26.04.2015Map
. Но у вас есть очень веская точка зрения; интерфейсMap
толстый. Возможно, изначально его следовало разделить наMap
иModifiableMap extends Map
. - person Mick Mnemonic   schedule 26.04.2015List
не должно иметьadd
, поскольку не всеList
объекты могут быть добавлены). Kotlin — прекрасный пример того, как это должно было быть обработано: разделение методаadd
наMutableList
и сохранение неизменностиList
. Из-за этого Kotlin фактически сопоставляет коллекции Java со своими собственными коллекциями (при взаимодействии между ними) во время компиляции. - person Dioxin   schedule 03.08.2016