Duda general sobre 'static'

Iniciado por reygecko, 18 Enero 2013, 11:23 AM

0 Miembros y 1 Visitante están viendo este tema.

reygecko

No sé ni cómo empezar a plantear esta duda.  Espero explicarme...

Estoy haciendo un programa y lo tengo bastante avanzado, ocupa casi 400 líneas.  El caso es que para ese programa definí una clase (llamémosla X) para poder crear registros que tuvieran varios campos, unos cuantos numéricos y otro de tipo matriz.

Pues bien, el problema me surge cuando intento hacer un ArrayList con distintos registros de esa clase X.  Esa lista la genera un método y ocurre que todos los elementos de esa lista son iguales, aunque no deberían serlo.

Según creo, eso ocurre porque definí la clase X como 'static' y, entonces, al generarse varios elementos de esa clase, se generan todos igual (si no es así, por favor corregidme).  Pero si elimino el 'static', entonces esa clase no puede ser usada por los métodos, ya que también son 'static'.  Y si elimino el 'static' de todos los métodos, entonces no pueden ser usadas por el programa main, que tiene que ser 'static' obligatoriamente.

No sé, estoy muy perdido con esto.  :-\  ¿Algún consejo?  Gracias de antemano.

RevangelyonX

#1
Hola,

No acabo de enteder o visualizar tu código es posible que pegues alguna parte?
Estas rellenando un arraylist con valores de una clase estatica?

Cuando dices registros te refieres a propiedades o el return de algun método estatico?
Just Linux
OSCP certified

Novlucker

Sin el código es algo difícil de darte respuesta.

Static se refiere a que el valor de una propiedad no depende de una instancia de clase, creo que con esto te tiene que quedar más claro.
También tu problema puede ser que a la hora de agregar los objetos al ArrayList, estas reutilizando la instancia del mismo objeto en lugar de hacer un new cada vez, y por ende estas agregando el mismo objeto muchas veces.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

reygecko

#3
Lo primero, muchas muchas gracias a los dos por tomaros la molestia de tratar de ayudarme.  

Respecto del código, no lo he puesto por dos motivos.  El primero es que son casi 400 líneas y (creo yo) desmoralizaría a cualquiera que quiera ayudar.  El segundo es que se trata de un trabajo para mi universidad y ni siquiera sé si puedo publicarlo sin infringir alguna norma y acabar suspendido.

Pero os copio/pego las partes que me parecen relevantes y si veis que necesitáis más información, pues me lo decís y hago los copia/pega que hagan falta.  ;D

Primero os pongo un esquema general de la estructura del programa:


La clase que definí (en otros lenguajes habría definido un tipo abstracto de datos, pero en Java... no sé si estoy haciendo lo correcto) está situada en el primer bloque, junto a las variables, y fue ésta:


static class TAD {

       int x, y, N, futuro;
       int matriz[][];
   }


Y el problema lo detecté al utilizar esa clase desde un método (desde uno de los bloques 'método n') para hacer un ArrayList formado por elementos de esa clase.  El código de ese método es éste:


static List<TAD> crearLista(TAD ensayo) {
       List<TAD> lista = new ArrayList<>();
       TAD test = new TAD();
       test.matriz = new int[tamañoMatriz][tamañoMatriz];
       copiarTAD(ensayo, test);
       for (int a = -2; a < 3; a++) {
           for (int b = -2; b < 3; b++) {
               if (((Math.abs(a)) + (Math.abs(b)) == 3)
                       && (ensayo.matriz[ensayo.x + a][ensayo.y + b] == 0)) {
                   test.x = ensayo.x + a;
                   test.y = ensayo.y + b;
                   test.N = ensayo.N + 1;
                   test.futuro = hacerListaDeEnteros(test);
                   lista.add(test);
               }
           }
       }
       return lista;
   }


Ese método lo llamo desde main con este código:


    lista1 = crearLista(ensayo);


Luego compruebo con lista1.size() que la lista tiene 2 elementos (eso está bien, es lo que esperaba) pero cuando compruebo los elementos veo que son iguales, y no deberían serlo.  

Y aquí me quedé atascado.  :-( No sé cómo seguir.  Si quito el valor static del tipo de datos que yo definí (TAD), entonces no puedo invocarlo desde los métodos o desde main.  Si no lo quito, el valor del contenido del registro es igual para todos los elementos de la lista 'lista1'.

Agradecería cualquier ayuda.  Un saludo.

reygecko

Cita de: RevangelyonX en 18 Enero 2013, 13:49 PM
Hola,

No acabo de enteder o visualizar tu código es posible que pegues alguna parte?
Estas rellenando un arraylist con valores de una clase estatica?

Cuando dices registros te refieres a propiedades o el return de algun método estatico?

Exacto.  Lo que pretendo es formar una lista (ArrayList) con unos elementos que tengan la estructura definida en la clase TAD.  Es decir, formar un ArrayList donde cada elemento de la lista tenga varias propiedades (4 numéricas y 1 de tipo matriz).

Cuando digo 'registros' me refiero a cada uno de los elementos del tipo TAD.  No sé si mi forma de llamarlo es la correcta.  Según lo que sé de otros lenguajes, uno define un tipo abstracto de datos del modo en que mejor se adecúa a sus necesidades.  Pues eso es lo que yo pretendía hacer definiendo la clase TAD (Tipo Abstracto de Datos), porque necesitaba 'registros', 'elementos' o el nombre que mejor sirva, formados por esos campos.

El problema está en que, al rellenar el ArrayList con esos elementos, en realidad todos los elementos son iguales, aunque me consta (lo he comprobado) que no es así.  Por eso creo que es cosa del 'static' de la clase.

No sé si te estoy aclarando lo que preguntabas...

seba123neo

es un simple ArrayList de objetos, en este caso de una clase custom definida por vos, proba hacer TAD test = new TAD(); dentro del for y no fuera.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

reygecko

Cita de: Novlucker en 18 Enero 2013, 14:00 PM
Sin el código es algo difícil de darte respuesta.

Static se refiere a que el valor de una propiedad no depende de una instancia de clase, creo que con esto te tiene que quedar más claro.
También tu problema puede ser que a la hora de agregar los objetos al ArrayList, estas reutilizando la instancia del mismo objeto en lugar de hacer un new cada vez, y por ende estas agregando el mismo objeto muchas veces.

Saludos

Ya había consultado ayer el enlace que me has puesto, por eso creo que el problema podría estar en el 'static'.  

Sin embargo, me parece muy interesante tu indicación sobre hacer un new cada vez que agrego un objeto al ArrayList.  Ahora lo estoy haciendo con este código: "lista.add(test)", donde test es un objeto tipo TAD del que voy variando sus valores uno a uno.  ¿No debería hacerlo así? ¿Cuál sería entonces el modo correcto?

Gracias por adelantado.  :)

Novlucker

Cita de: seba123neo en 18 Enero 2013, 15:50 PM
es un simple ArrayList de objetos, en este caso de una clase custom definida por vos, proba hacer TAD test = new TAD(); dentro del for y no fuera.

Cita de: Novlucker en 18 Enero 2013, 14:00 PM
[...]También tu problema puede ser que a la hora de agregar los objetos al ArrayList, estas reutilizando la instancia del mismo objeto en lugar de hacer un new cada vez, y por ende estas agregando el mismo objeto muchas veces.[...]

Es exactamente lo que estás haciendo, no estas creando una nueva instancia de clase, por ende, cuando tu asignas los valores lo estas haciendo en el mismo objeto, y cuando realizas el lista.add estas simplemente agregando el mismo objeto muchas veces, de ahí que todos sean iguales.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

reygecko

Sois unos ***** genios.   ;-)

Y yo soy un puto ignorante que pregunta estupideces, soy un borrico, borrico, borrico...

De verdad, muchísimas gracias a todos por vuestra ayuda.  No sé qué haría sin ella.  Voy a ponerme con el código a ver si le saco algún provecho.