В настоящее время я обновляю свои знания Java с помощью примера кода среднего размера. У меня есть структура данных Map<String, String>
, и я обычно инициализирую ее с помощью new LinkedHashMap<>()
, чтобы сохранить порядок вставки. Я очень часто использую это в своем коде и хочу избавиться от повторения объявлений. В C++ я бы назвал карту псевдонимом, но в Java, насколько мне известно, псевдонима нет.
Поэтому мне пришла в голову идея создать подкласс общего типа следующим образом:
public class Attributes extends LinkedHashMap<String, String> {
public Attributes() {
super();
}
public Attributes(Map<? extends String, ? extends String> map) {
super(map);
}
}
Пока это выглядит хорошо, но теперь я хочу создать неизменяемую копию этого, потому что атрибуты должны быть частью неизменяемых/неизменяемых структур данных. До того, как я использовал это:
Map<String, String> unmodifiableAttributes = Collections.unmodifiableMap(
new LinkedHashMap<>(attributes)
);
Это не работает для производного класса, я пробовал это:
Attributes unmodifiableAttributes = Collections.unmodifiableMap(
new Attributes(attributes)
);
Компилятор отклоняет его с помощью Incompatible types
.
Есть ли простой способ получить неизменяемую (или неизменяемую) копию такого подкласса? Или моя мысль совершенно неверна? Я не хочу писать полнофункциональный декоратор, всего несколько строк кода.
ОБНОВЛЕНИЕ
Пока что похоже, что нет хорошего решения для того, что я хочу сделать. Я просмотрел исходный код класса Java Collections, и там есть внутренние классы для немодифицируемых карт и подобных коллекций. Они используются для переноса входной коллекции и возвращаются соответствующими статическими методами. Можно было бы переопределить это, но я думаю, что это было бы слишком много накладных расходов.
У нас было больше обсуждения нарушения LSP вместо исходного вопроса, что тоже действительно интересно.