¿Cómo iniciar objetos nulos en una matriz?

public static MyType mtOrders;    
public static MyType mtCustomers;    
public static MyType mtItems;    
public static MyType mtGroups;    
public static MyType mtDelieverAddresses;    
public static MyType mtVendors;    
public static MyType mtOrderItems;    
public static MyType mtPrims;        

public final static MyType[] xTable = {mtCustomers, mtGroups, mtItems, mtOrders,
                        mtDelieverAddresses, mtVendors, mtOrderItems, mtPrims};

for (int i = 0; i < xTables.length; i++) {    
  xTable[i] = new MyType();
}

Después de ejecutar xTableLos elementos de se inicializan, pero mtOrders... mtPrims son nulos!

Entiendo por qué esto es así, pero no puedo pensar cómo inicializo los objetos en el ciclo.

No quiero hacer esto:

mtOrders = new MyType();
mtCustomers = new MyType();
...
mtPrims = new MyType();

preguntado el 01 de julio de 12 a las 09:07

2 Respuestas

xTable y esa serie de variables estáticas son diferentes referencias, Que podría punto en el mismo objeto, pero no se puede utilizar para modificar uno al otro. Es decir, ambos se pueden utilizar para modificar el mismo objeto, pero tener un punto en un objeto no hará que el otro punto también esté en ese objeto.

No entiendo muy bien tu objetivo real. Lo mejor que puedo ofrecer es usar alguna clase intermedia a la que todos apuntarán. Entonces mtOrders no será un MyType, Pero una MyTypeRef, que tendrá un MyType campo. Luego, inicialícelo a un nuevo MyTypeRefy use el bucle para establecer el MyType objetos en todas las referencias. Dado que tanto las variables estáticas como las xTable las entradas apuntarán en el mismo MyTypeRef, configurando el MyType campo en uno afectará al otro también.

En mi opinión, usar ese ciclo en lugar de inicializar cada variable por separado parece un código más estricto, pero no funciona. Simplemente escriba algunas líneas más de código, por lo que no es tan bonito pero realmente funciona.

Respondido 01 Jul 12, 09:07

Bueno, no estoy loco por esta solución, porque agrega un contenedor adicional a cada variable solo para evitar algunos problemas de inicialización. Pero es tu código... - Eran

Mi inicialización es realmente mucho más compleja de lo que mostré. Pienso que es más simple agregar una nueva var a la matriz, que copiar y pegar muchas líneas de código. - Ololosh Obhohochidse

Java no tiene otra forma de inicializar una variable de referencia que no sea asignársela. Quizás puedas acercarte a lo que quieres con un mapa:

public static final String myOrders = "mtOrders";
// etc.

public final static Map<String, MyType> xTable;

static {
    HashMap<String, MyType> table = new HashMap<String, MyType>();
    String[] keys = { myOrders, . . . }
    for (int i = 0; i < keys.length; ++i) {
        table.put(keys[i], new MyType());
    }
    xTable = Collections.unmodifiableMap(table);
}

Luego puede obtener elementos individuales al:

MyType orders = xTable.get(myOrders);

Si esto no satisface sus necesidades, solo tendrá que asignar cada campo individualmente.

Respondido 01 Jul 12, 09:07

Gracias por su respuesta. Haré lo que me sugirió eran. - Ololosh Obhohochidse

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.