elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Duda general sobre 'static'
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda general sobre 'static'  (Leído 3,677 veces)
reygecko

Desconectado Desconectado

Mensajes: 26



Ver Perfil
Duda general sobre 'static'
« en: 18 Enero 2013, 11:23 am »

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

Desconectado Desconectado

Mensajes: 245


Ver Perfil WWW
Re: Duda general sobre 'static'
« Respuesta #1 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?


« Última modificación: 18 Enero 2013, 13:53 pm por RevangelyonX » En línea

Just Linux
OSCP certified
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Duda general sobre 'static'
« Respuesta #2 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
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 Desconectado

Mensajes: 26



Ver Perfil
Re: Duda general sobre 'static'
« Respuesta #3 en: 18 Enero 2013, 15:38 pm »

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:

Código:
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:

Código:
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:

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 Desconectado

Mensajes: 26



Ver Perfil
Re: Duda general sobre 'static'
« Respuesta #4 en: 18 Enero 2013, 15:47 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...
En línea

seba123neo


Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: Duda general sobre 'static'
« Respuesta #5 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.
En línea

reygecko

Desconectado Desconectado

Mensajes: 26



Ver Perfil
Re: Duda general sobre 'static'
« Respuesta #6 en: 18 Enero 2013, 15:53 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.  :)
En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Duda general sobre 'static'
« Respuesta #7 en: 18 Enero 2013, 15:55 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.

[...]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 Desconectado

Mensajes: 26



Ver Perfil
Re: Duda general sobre 'static'
« Respuesta #8 en: 18 Enero 2013, 15:58 pm »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Duda General/Phytoh] Lenguaje
Programación General
Darlak 1 1,820 Último mensaje 9 Octubre 2013, 00:59 am
por zimmerman
Duda sobre routers/modems e internet en general
Redes
AlexKurban 3 2,866 Último mensaje 26 Noviembre 2013, 21:12 pm
por Saberuneko
Duda ejercicio java variable static
Java
beginner6 5 3,003 Último mensaje 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,266 Último mensaje 28 Junio 2016, 09:12 am
por Orubatosu
(Duda sobre Windows, no general) Ejemplo de funcionamiento de un bootstrap
Dudas Generales
Usuario887 0 2,288 Último mensaje 25 Septiembre 2021, 23:49 pm
por Usuario887
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines