2009-07-21 10 views
9

Solo quiero saber por qué se usa realmente java.util.Collections.checkedList().¿Qué es la llamada Collections.checkedList() en java?

Tengo un código que sé que me devuelve un List<String> pero está siendo pasado a través de una cadena de llamadas de mensajes y me lo devolvieron como java.io.Serializable. ¿Es correcto que callList llame para convertir mi Serializable en List<String>? Sé que puedo lanzarlo a java.util.List, pero prefiero no tener que verificar cada elemento y no me siento cómodo suponiendo que cada elemento es String.

Respuesta

16

Se utiliza en parte como una herramienta de depuración para encontrar dónde el código inserta una clase del tipo incorrecto, en caso de que eso ocurra, pero no puede determinar dónde.

Podría usarlo como parte de una API pública que proporciona una colección y desea asegurarse de que la colección no obtenga nada del tipo incorrecto (si, por ejemplo, el cliente borra los genéricos).

La forma en que se podría utilizar en su caso es:

Collections.checkedList(
     new ArrayList<String>(uncertainList.size()), String.class) 
     .addAll(uncertainList); 

Si eso no lanzar una excepción, entonces usted sabe que son buenos. Esa no es exactamente una pieza de código optimizada para el rendimiento, pero si el contenido de la lista es razonablemente pequeño, debería estar bien.

+0

Niza solución! –

14

No del todo:

Collections.checkedList sólo se va a decorar la lista para evitar cualquier inserción futuros con los objetos de la clase equivocada, no va a comprobar todos los elementos que ya están en la lista.

Sin embargo, puede hacer una nueva checkList, y luego llamar al addAll y pasar la lista de la que no está seguro, en lugar de escribir el bucle usted mismo.

9

Se puede encontrar una discusión sobre el uso de checkedList en la documentación de checkedCollection. Las razones dadas son:

  • como una ayuda para la depuración (si alguien ha utilizado un molde sin marcar)
  • para garantizar la seguridad al pasar una colección a poblarse de código de terceros.

podría utilizar el siguiente desde google collections para comprobar que la lista no sólo contienen cadenas:

Iterables.all(list, Predicates.instanceOf(String.class)) 
+0

Gracias. Me lo perdí. Los IDE están arruinando mi lectura de javadoc. –