Каков тип немодифицируемого списка в java
Немодифицируемый список в java может быть создан как:
List<String> unModifiableStringList = Collections.unmodifiableList(myActualModifiableList);
это нормально, но каков фактический тип выполнения списка, возвращаемого вышеуказанной функцией? Как мы можем получить доступ к этому классу? Это вообще возможно?
обновление: на самом деле мне нужно знать во время компиляции, что немодифицируемый список изменяется, так как мне приходится иметь дело с большим количеством списков, некоторые из которых модифицируются, а другие нет. Так это очень громоздко отслеживать?
6 ответов
на самом деле мне нужно знать во время компиляции, что немодифицируемый список изменяется.
это невозможно.
или, по крайней мере, это невозможно без создания совершенно другого интерфейса коллекций / иерархии классов. И это плохая идея, потому что ничто, предназначенное для использования регулярных коллекций, не будет работать с ним.
Я полагаю, что можно было бы написать статический анализатор кода, который мог бы обнаружить такие вещи ... в некоторые случаях ... но это не совсем "время компиляции". Кроме того, я не знаю ни одного существующего статического анализатора кода, который делает это "из коробки".
интересно, была ли причина, по которой они это сделали.
Это
static class UnmodifiableList<E> extends UnmodifiableCollection<E>
implements List<E>
static class UnmodifiableRandomAccessList<E> extends UnmodifiableList<E>
implements RandomAccess
static class UnmodifiableCollection<E> implements Collection<E>, Serializable
- Это внутренний класс Collections
С Collections
не является экземпляром, и это внутренний класс с видимостью пакета, вы не может доступ к классу, и это реализация, скрывающаяся в ООП.
ты пробовал unModifiableStringList.getClass().getName()
?
мне это дает
java.util.Collections$UnmodifiableRandomAccessList
который, как видно из исходного кода, является статическим внутренним классом Collections
.
это внутренний класс Collections
:
static class UnmodifiableList<E> extends UnmodifiableCollection<E>
implements List<E>
Debug показывает, что тип среды выполнения Collections.UnmodifiableRandomAccessList
, Так что это внутренний класс. Анализ кода показывает, что это может быть Collections.UnmodifiableList
.
вы не должны пытаться получить доступ к этому классу, оно должно быть неизменным. Попробуйте вместо этого использовать общий интерфейс, в этом случае = Collection
.
в вашем заявлении ясно говорится, что его все еще ссылка на список, но он подавляет модификацию списка.
Если вы разделяете неизменяемую ссылку на список, вы убедитесь, что никто ее не изменяет и разрешаете операции только для чтения.