2011-06-29 20 views
5

Tengo un pequeño problema para entender algo, podría estar yendo por completo mal.Extendiendo ArrayList y Creando nuevos métodos

Estoy tratando de crear una clase que se extiende ArrayList, pero tiene varios métodos que aumentan la funcionalidad (por lo menos para el programa que estoy desarrollando.)

Uno de los métodos es un findById (int id), el cual busca en cada objeto ArrayList una determinada coincidencia de id. Hasta ahora está funcionando, pero no me deja hacer for (Item i : this) { i.getId(); }

No entiendo por qué?

código completo:

public class CustomArrayList<Item> extends ArrayList<Item> { 

    // declare singleton instance 
    protected static CustomArrayList instance; 

    // private constructor 
    private CustomArrayList(){ 
     // do nothing 
    } 

    // get instance of class - singleton 
    public static CustomArrayList getInstance(){ 
     if (instance == null){ 
      instance = new CustomArrayList(); 
     } 
     return instance; 
    } 

    public Item findById(int id){ 
     Item item = null; 
     for (Item i : this) { 
      if (i.getId() == id) { 
         // something 
     } 
     } 
     return item; 
    } 
    public void printList(){ 
     String print = ""; 
     for (Item i : this) { 
      print += i.toString() + "\n"; 
     } 
     System.out.println(print); 
    } 
} 

Respuesta

7

Cambio

public class CustomArrayList<Item> extends ArrayList<Item> { 

a

public class CustomArrayList extends ArrayList<Item> { 

Sospecho Item es el nombre de la clase que desea almacenar en la lista . Al agregar <Item> después de CustomArrayList está introduciendo un parámetro de tipo que sombrea esta clase.


Con el parámetro <Item>, su código es igual a

public class CustomArrayList<T> extends ArrayList<T> { 
    // ... 
     for (T i : this) { i.getId(); } 
    // ... 
} 

que, evidentemente, no siempre va a funcionar, como T puede referirse a cualquier tipo.

+0

impresionante. ¿Es solo la sintaxis adecuada, o estaba tratando de hacer otra cosa? Muchas gracias! Respuesta rápida. – Cody

+1

Esa es probablemente la sintaxis adecuada para su escenario. Se actualizó la respuesta para explicar por qué. – aioobe

+1

¡Gracias! Eso lo explica muy bien. – Cody

2

¿Qué es getId()? Es de suponer que es un método en alguna clase, pero no sabemos que clase.

Si en realidad tiene una clase llamada Item con un método getId(), del que se supone que es una lista, simplemente necesita evitar que su clase sea genérica. Así que en lugar de esto:

public class CustomArrayList<Item> extends ArrayList<Item> { 

desea:

public class CustomArrayList extends ArrayList<Item> { 

Actualmente dentro de su clase, Item no se refiere a una clase llamada artículo, se refiere a un parámetro de tipo llamada Item.

Ahora personalmente:

  • no sería evitar la creación de conjuntos unitarios, a menos que realmente tienen que
  • Si es necesario, yo evitaría la creación de ellos en la forma que tiene (que no se enrosque -safe)
  • que no se extendería ArrayList<> a menos que realmente tenía que hacerlo, prefiriendo la composición sobre la herencia
+0

Estoy creando un singleton por el motivo de que solo puedo tener uno. Sé que la forma en que lo estoy creando no es segura para subprocesos, necesitaría tener un "método de bloqueo", ¿correcto? Lo que aioobe publicó resolvió mi problema, pero aún estoy interesado en crear un singleton seguro para subprocesos. – Cody

+1

La forma preferida de crear un singleton en Java 1.5+ es usar un Enum. Ver, por ejemplo, esta pregunta: http://stackoverflow.com/questions/70689/efficient-way-to-implement-singleton-pattern-in-java – aioobe

Cuestiones relacionadas