Каков тип немодифицируемого списка в 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.


см.: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.unmodifiableList%28java.util.List%29

это внутренний класс Collections:

static class UnmodifiableList<E> extends UnmodifiableCollection<E>
                                 implements List<E>

Debug показывает, что тип среды выполнения Collections.UnmodifiableRandomAccessList, Так что это внутренний класс. Анализ кода показывает, что это может быть Collections.UnmodifiableList.

вы не должны пытаться получить доступ к этому классу, оно должно быть неизменным. Попробуйте вместо этого использовать общий интерфейс, в этом случае = Collection.


в вашем заявлении ясно говорится, что его все еще ссылка на список, но он подавляет модификацию списка.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#unmodifiableList(java.util.List)

Если вы разделяете неизменяемую ссылку на список, вы убедитесь, что никто ее не изменяет и разрешаете операции только для чтения.