#java #collections #immutability
#java #Коллекции #неизменяемость
Вопрос:
Я изучаю Java Collections FrameWork.
У меня возникли проблемы с пониманием иерархии коллекций.
Поскольку ArrayList реализует интерфейс списка, мы можем использовать
List<String> list = new ArrayList();
Однако в
List<String> names = List.of("Larry", "Kenny", "Sabrina");
List.of()
метод возвращает неизменяемые коллекции.Список 12
Я никогда не слышал об этом классе в иерархии коллекций, и я обнаружил, что он не реализует интерфейс List (тогда как он преобразуется в List?)
кроме того, я думаю, странно, что я не могу создать ImmutalbeList с помощью
List<String> names = new ImmutableList("Larry", "Kenny", "Sabrina");
Я мало знаю о Kotlin, и между изменяемыми и неизменяемыми существовала иерархия. Но я не могу найти никакой связи между ними в Java.
что здесь происходит?
Комментарии:
1.
List12
расширяет,AbstractImmutableList
который реализуетList
.2. Фактические детали реализации различаются. Подумайте о том, чтобы тоже взглянуть на источник
3. Если это из любопытства: хорошо. Но, в общем, в документации говорится, что
List.of
возвращает aList
, и это все, о чем вы должны заботиться. Конкретный тип, который он возвращает, является деталью реализации.4. Стандартная библиотека Java не имеет неизменяемого интерфейса коллекции. Все изменчиво. Неизменяемые коллекции реализуются путем обновления методов, таких как
add()
выбрасываниеUnsupportedOperationException
.
Ответ №1:
Неизменяемая коллекция такая же, как обычная коллекция, но не может быть изменена после создания (т. Е. она доступна только для чтения). вы не можете добавлять, удалять или обновлять элементы, если вы попытаетесь, это вызовет исключение unsupportetOperationException.
Вы не можете создать экземпляр ImmutableList с помощью new ImmutableList()
, потому что это абстрактный класс. вы можете использовать ImmutableList.of()
метод для получения списка неизменяемых объектов.
Если вы хотите узнать больше о ImmutableList, смотрите Geeksforgeeks — ImmutableList в java
Ответ №2:
Чтобы тщательно проанализировать, почему это происходит, давайте начнем с определения неизменности:
‘Объект считается неизменяемым, если его состояние не может измениться после его создания. Максимальная зависимость от неизменяемых объектов широко признана разумной стратегией для создания простого и надежного кода.
Мы также можем подтвердить, что не можем изменить состояние, когда смотрим на один из хорошо известных классов в Java. Де строковый класс.
public class Main {
public static void main(String[] args) {
String hello = "hello";
hello.concat("world");
System.out.println(hello);
}
}
Это не изменит состояние объектов, если мы применим метод concat, и вернет только «hello». Однако, если мы инициализируем результат в новую переменную, то он будет иметь соответствующий результат, подобный этому
public class Main {
public static void main(String[] args) {
String hello = "hello";
String newHello = hello.concat("world");
System.out.println(newHello);
}
}
Проблема с этим заключается в том, что метод concat лжет мне. В нем говорится, что он что-то объединит, но на самом деле это не так, потому что string является неизменяемым. Отсюда следует, что, поскольку неизменяемый объект не может изменить свое состояние, у нас также не должно быть методов, которые изменяют его состояние.
Поскольку у нас не может быть этих методов для неизменяемого типа, и мы, мы не можем просто реализовать часть интерфейса, нам нужно создать другой интерфейс, который содержит только методы, которые могут считывать данные из списка, но не изменяют состояние объекта, как, например, List.add() .