Принцип замены Лискова является одним из принципов SOLID. Я читал этот принцип несколько раз и стараюсь его понять.
Вот что я из него сделаю,
Этот принцип связан с сильным поведенческим контрактом между иерархия классов. Подтипы должны быть заменены на супертип без нарушения договора.
Я прочитал еще один articles, и я немного потерял мысль об этом вопросе. Методы Collections.unmodifiableXXX()
не нарушают LSP?
Выдержка из статьи, приведенной выше:
Другими словами, при использовании объекта через интерфейс базового класса, пользователь знает только предварительные условия и постусловия базы класс. Таким образом, производные объекты не должны ожидать, что такие пользователи будут подчиняться предварительные условия, которые сильнее, чем те, которые требуются базовому классу
Почему я так думаю?
Перед
class SomeClass{
public List<Integer> list(){
return new ArrayList<Integer>(); //this is dumb but works
}
}
После
class SomeClass{
public List<Integer> list(){
return Collections.unmodifiableList(new ArrayList<Integer>()); //change in implementation
}
}
Я не могу изменить имплантацию SomeClass
, чтобы возвращать немодифицируемый список в будущем. Компиляция будет работать, но если клиент каким-то образом попытается изменить возвращаемый List
, тогда он будет терпеть неудачу во время выполнения.
Именно поэтому Guava создал отдельный интерфейс ImmutableXXX для коллекций?
Разве это не прямое нарушение LSP, или я полностью понял это неправильно?