2012-05-07 19 views
5

lista no modificable en Java se puede crear como:¿Cuál es el tipo de lista no modificable en Java

List<String> unModifiableStringList = Collections.unmodifiableList(myActualModifiableList); 

Esto está muy bien, pero ¿cuál es el tipo de tiempo de ejecución real de la lista devuelta por la función anterior? ¿Cómo podemos acceder a esa clase? ¿Es posible?

ACTUALIZACIÓN: En realidad necesito saber en tiempo de compilación que se está modificando una lista no modificable, ya que tengo que lidiar con un montón de listas, algunas de las cuales son modificables y otros no lo son. Entonces, ¿es muy engorroso realizar un seguimiento?

Respuesta

8

En realidad, necesito saber en tiempo de compilación que se está modificando una lista no modificable.

Eso no es posible.

O al menos, no es posible sin crear una jerarquía de clase/interfaz de colecciones completamente diferente. Y esa es una mala idea porque nada diseñado para usar colecciones regulares funcionaría con eso.

Supongo que sería posible escribir un analizador de código estático que pudiera detectar este tipo de cosas ... en algunos casos ... pero eso no es estrictamente "tiempo de compilación". Además, no conozco ningún analizador de código estático existente que haga esto "fuera de la caja".


Me pregunto si había una razón por qué lo hicieron así.

bien ninguna de las maneras que usted puede ser que hacer esto realmente funciona.

Alternativa # 1:

public interface UnmodifiableList<T> { 
    public T get(int pos); 
    .... 
} 

public interface List<T> extends UnmodifiableList<T> { 
    public void add(T elem); 
    .... 
} 

Mientras tipos estáticos puede evitar que el uso de una lista no modificable donde se requiere una modificables, lo contrario no es cierto. Cada lista es también una lista inmodificable ... y eso realmente no tiene sentido.

Alternativa 2:

public interface List <T> { 
    public T get(int pos); 
    public void add(T elem); 
    .... 
} 

public interface UnmodifiableList<T> { 
    // A marker interface 
} 

tipificación estática Ahora nos puede evitar que utilice una lista modificable, donde se requiere una umodifiable uno, pero no a la inversa. (Eso satisface sus requisitos ...) Además, una clase que implementa UnmodifiableList sigue heredando la operación add, y no hay nada que impida que una aplicación intente llamarlo.

En resumen, los sistemas de tipo estático no pueden manejar adecuadamente este tipo de restricciones.

+0

Me pregunto si hubo una razón por la que lo hicieron así. :( –

+2

Como regla general, debe codificar las interfaces en lugar de clases de tiempo de ejecución reales. Collections.unmodifiableList está diseñado, de hecho, para forzarle a codificar en la interfaz. –

+0

@LouisWasserman - No creo que sea relevante a las preguntas de seguimiento de la OP, es decir, a las que estoy respondiendo. –

3

¿Has probado unModifiableStringList.getClass().getName()?

Para mí da

java.util.Collections$UnmodifiableRandomAccessList 

el cual, como se ve desde el código fuente, es un paquete de acceso clase interna estática de Collections.

+0

+1 de mí ..... –

0

depuración muestra que el tipo de tiempo de ejecución es Collections.UnmodifiableRandomAccessList, así que es clase interna. El análisis de código también muestra que podría ser Collections.UnmodifiableList.

No intente acceder a esta clase, debe ser inmutable. Intente utilizar una interfaz común en su lugar, en este caso = Collection.

3

Es

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 

Es clase interna de Collections, ya Collections es no instanciable y es clase interna con visibilidad de paquete, que no puede acceder a la clase, y es el escondite aplicación en OOP.

+0

¿Cómo puedo verificar en mi código si una lista no es modificable o no? –

+0

@djaqeel Creo que solo se puede verificar en tiempo de ejecución, pero no en tiempo de compilación. Y no se recomienda verificar en tiempo de ejecución también. –

Cuestiones relacionadas