Typesafe Lista en Java 5 + la segunda parte …

Parece que el comentario de John en el post de ayer a los dos tenía la mitad de la noche trabajando en lo mismo. Les dejo mi versión aquí debido a que tiene un parámetro que permite a la persona que llama a determinar el equilibrio entre la velocidad y la seguridad. Durante la depuración, puede utilizar Check.ALL (o dejarlo null). En el código de rendimiento crítico, posteriormente se pueden fijar a NINGUNO. Check.FIRST es para situaciones en las que sólo una prueba de cordura – es rápido y mejor que nada

También he incluido algo de código de prueba y una rutina que se aprovecha de la String.valueOf () para. coaccionar a cada elemento de la lista original de una cadena, si es necesario, tanto la forma en que muchos lenguajes de tipado dinámico hacen. Me pregunto si sería conveniente para optimizar aún más este método para las listas largas de dividir la lista original en lotes de productos que no necesitan de colada y la copia de esas carreras con stringList.addAll (list.subList (fromIdx, toIdx)) en lugar de la copia un elemento a la vez?

La solución de Juan usa B.class.isAssignableFrom (a.getClass ()) , mientras que la mía utiliza un instanceof B . Creo que cualquiera de las obras en este caso debido a que una lista sólo puede contener objetos, no primitivos. Si se tratara de los primitivos, la solución de John manejaría más casos que los míos. No estoy seguro si hay consideraciones de rendimiento, pero dudo que serían importantes

  java.util.ArrayList importación;. 
Java.util.List importación;

public class Typesafe {

public enum descubre {
NONE,
PRIMERA,
TODOS; />}

@ SuppressWarnings ({"sin marcar"})
Lista typeSafeList public static (list Listado,
Clase clazz,
¡Compruebe la seguridad) {
si (clazz == null) {
throw new IllegalArgumentException ("typeSafeList () requiere un parámetro de clase no nulo");}


/ / ¿Hay que realizar todas las comprobaciones?
si (seguridad = Check.NONE!) {
if ((list = null) && (list.size ()> 0)!) {
for (Object item: lista) {
if ((artículo! = null) &&
(item instanceof String)) {throw new
ClassCastException (/>
item.getClass () getCanonicalName () +
", que no es un (a)" +
clazz.getCanonicalName ());}

/ / ¿Hay que dejar de el primer éxito
si (la seguridad == Check.FIRST) {descanso /> }
/ / Default (Check.ALL) comprueba cada elemento de la lista }}

} / / fin si realiza ninguna comprobación
(Lista ) Lista de retorno;
} / / fin typeSafeList ()

Lista pública estática coerceToStringList (list Listado) {
if (lista == null) {/>


try {/ / Devuelva la antigua lista si ya es seguro typeSafeList
retorno (lista, String.class, Check.ALL);
} (cce ClassCastException) catch {
/ / Lista Antiguo no es seguro. Hacer uno nuevo
Lista StringList = new ArrayList ();

para. (Object item: lista) {
if (elemento == null) {
stringList.add (null);
} else if (elemento instanceof String) {
stringList.add (material (String));
} else {
/ / Si esto lanza una ClassCastException, que así sea
stringList.add (String.valueOf (tema));.

StringList}}
retorno;}

typeSafeList} / / fin ()

@ SuppressWarnings ({"sin marcar"})
private static List makeTestList () {Lista />
l.add ("Hello");
l.add (null);
l.add (new Integer (3));
l.add ("mundo" );
retorno l;
} / / fin makeTestList ()

principales (String [] args void estáticos públicos) {
Lista unsafeList = makeTestList ();
Lista StringList = coerceToStringList (unsafeList);

(System.out.println "secuencias obtenidas por la fuerza:");
para (String s: StringList) {
System.out.println (s);}


Lista SafeList = typeSafeList (unsafeList,
String.class,
Check.ALL) ;

System.out.println ("Lista-casted seguro:");
para (String s: SafeList) {
System.out.println (s),
}
} / / fin de main ()
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *