Autor
|
Tema: Duda general sobre 'static' (Leído 3,704 veces)
|
reygecko
Desconectado
Mensajes: 26
|
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.
|
|
|
En línea
|
|
|
|
RevangelyonX
|
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?
|
|
« Última modificación: 18 Enero 2013, 13:53 pm por RevangelyonX »
|
En línea
|
Just Linux OSCP certified
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 26
|
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. 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.
|
|
« Última modificación: 18 Enero 2013, 15:40 pm por reygecko »
|
En línea
|
|
|
|
reygecko
Desconectado
Mensajes: 26
|
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...
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
reygecko
Desconectado
Mensajes: 26
|
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.
|
|
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
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. [...]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
|
|
|
En línea
|
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
Desconectado
Mensajes: 26
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Duda General/Phytoh] Lenguaje
Programación General
|
Darlak
|
1
|
1,847
|
9 Octubre 2013, 00:59 am
por zimmerman
|
|
|
Duda sobre routers/modems e internet en general
Redes
|
AlexKurban
|
3
|
2,886
|
26 Noviembre 2013, 21:12 pm
por Saberuneko
|
|
|
Duda ejercicio java variable static
Java
|
beginner6
|
5
|
3,026
|
11 Noviembre 2014, 18:09 pm
por beginner6
|
|
|
(duda/reflexion) sobre el tema de la privacidad en general
« 1 2 3 »
Foro Libre
|
crazykenny
|
20
|
9,384
|
28 Junio 2016, 09:12 am
por Orubatosu
|
|
|
(Duda sobre Windows, no general) Ejemplo de funcionamiento de un bootstrap
Dudas Generales
|
Usuario887
|
0
|
2,328
|
25 Septiembre 2021, 23:49 pm
por Usuario887
|
|