2011-08-10 17 views
5

La API de Collections.checked *() de Java nos proporciona vistas de tipo seguro para colecciones subyacentes. Pero las comprobaciones ocurren en tiempo de ejecución y arrojan una excepción de tiempo de ejecución que puede ser costoso para el rendimiento. La misma comprobación de tipo se puede aplicar en tiempo de compilación dando un tipo específico a esas colecciones mediante el uso de colecciones genéricas. Entonces, ¿hay situaciones en las que Collections.checked *() puntúe sobre colecciones genéricas con sus tipos especificados?Java Collections.checked *() versus colecciones genéricas

Respuesta

10

el Javadoc lo explica bien:

http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection%28java.util.Collection,%20java.lang.Class%29

El mecanismo de los genéricos en el lenguaje proporciona en tiempo de compilación (estática) comprobación de tipos, pero es posible derrotar a este mecanismo con los moldes sin marcar. Por lo general, esto no es un problema, ya que el compilador emite advertencias en todas las operaciones no verificadas. Sin embargo, hay momentos en que la verificación de tipo estático por sí sola no es suficiente. Por ejemplo, supongamos que una colección se pasa a una biblioteca de terceros y es imperativo que el código de la biblioteca no corrompa la colección insertando un elemento del tipo incorrecto.

0

Al usar una biblioteca antigua con tipos no seleccionados en un nuevo proyecto de 1.5+.

+1

porque trabajas en una compañía financiera, cuando necesitas pedir cambiar una biblioteca, y enfrentas un proceso burocrático de varios meses. Sí, tienes razón, debería conseguir un mejor trabajo ... –

5

La principal diferencia es que la verificación en tiempo de compilación se puede eludir fácilmente, tanto accidental como conscientemente.

El compilador indicará, si eso sucede, pero las advertencias se ignoran fácilmente y el problema puede ocurrir en alguna biblioteca en algún lugar. La información de tipo proporcionada por los genéricos es confiable, pero solo si todo el código involucrado se compila sin ninguna advertencia relacionada con los genéricos: sin moldes no verificados, sin tipos crudos.

El uso de Collections.checked*() le proporciona una forma de aplicar la restricción, incluso cuando utiliza un código que está fuera de su control (siempre que pueda pasar una colección propia).

1

Collectons.checkedXxxxx() realiza controles de tiempo de ejecución proporcionan seguridad adicional. El compilador se puede evitar mediante el borrado de tipo, sin embargo, las colecciones comprobadas siempre deben verificar que el tipo sea correcto.

Dudo que la diferencia de rendimiento sea suficiente para preocuparse. Es probable que sea de aproximadamente 10 ns o menos.

Cuestiones relacionadas