Foro de elhacker.net

Programación => Java => Mensaje iniciado por: snake_linux en 23 Febrero 2019, 12:55 pm



Título: Objeto se sobrescribe en otro.
Publicado por: snake_linux en 23 Febrero 2019, 12:55 pm
Buenas, llevo unos días intentando un pequeño proyecto en Java para prácticar y tener más soltura, es básicamente un juego desde la linea de comandos, las clases son las siguientes:

*) Ataque: Aquí sólo se definen las propiedades de distintos ataques.

*) Pokemon: Cada uno va a tener cuatro ataques, por lo que cada objeto pokemon debe tener un Array de ataques (con limite 4)

*) Ficheros: Las propiedades de cada pokemon y sus ataques correspondientes se guardan en un fichero de texto plano con la sintaxis "clave=valor" por lo que uso esta clase para parsear el fichero, es un método estático, una vez parseadas las propiedades creo los cuatro ataques, "relleno" el array de ataques, creo un pokemon y devuelve el objeto pokemon en cuestión.

*) Principal: El main del juego, desde aquí se llama al método estático de la clase Ficheros devolviendo un objeto pokemon.

El problema que tengo es el siguiente: En el main del juego debo de crear dos objetos pokemon llamando al método estático de la clase Ficheros, pero cuando lo hago, el array "ataques[4]" del primer pokemon es sobrescrito por el del segundo pokemon, depurando he podido observar que en el método estático de la clase ficheros los objetos se generan correctamente, en cambio cuando recupero el objeto en el main del juego es cuando se sobrescribe dicho array.

Lo extraño además, es que si hago esto en el main:

Código:
System.out.println(pokemon1.getAtaques()[1].getNombre());
System.out.println(pokemon2.getAtaques()[1].getNombre());

Funciona correctamente, pero si lo guardo en un objeto "Pokemon" y luego imprimo sus ataques, se sobrescribe, llevo dias con esto y me estoy quebrando la cabeza sin poder sacarlo.

El código está en este repo de github: https://github.com/sonozaki/pokejava

Gracias.


Título: Re: Objeto se sobrescribe en otro.
Publicado por: animanegra en 23 Febrero 2019, 13:03 pm
Código:
public static Pokemon miPokemon

No instancias dos objetos solo uno, que es estático. Entonces no sobreescribes un objeto en otro si no que creas uno al que le cambias los atributos.

Cada vez que cargas un nuevo poquemon del fichero deberías de generar un nuevo objeto de la clase Pokemon con un new Pokemon.



Título: Re: Objeto se sobrescribe en otro.
Publicado por: snake_linux en 23 Febrero 2019, 13:55 pm
Código:
public static Pokemon miPokemon

No instancias dos objetos solo uno, que es estático. Entonces no sobreescribes un objeto en otro si no que creas uno al que le cambias los atributos.

Cada vez que cargas un nuevo poquemon del fichero deberías de generar un nuevo objeto de la clase Pokemon con un new Pokemon.



Eso lo hago al final de la clase Ficheros con:

Código:
 miPokemon= new Pokemon(nombrePokemon, pociones, antidotos, ataques);


Título: Re: Objeto se sobrescribe en otro.
Publicado por: CalgaryCorpus en 23 Febrero 2019, 14:03 pm
En la clase Ficheros, no tiene sentido tener campos static para una clase que tiene 1 solo metodo. Esto tiene consecuencias si vas a invocar  a ese metodo mas de 1 vez.

Sugiero que definas todas los campos al interior de ese unico metodo. Con esto, cada vez que invoques ese metodo tendras versiones frescas de lo que creas y no estaras pisando lo anterior.


Título: Re: Objeto se sobrescribe en otro.
Publicado por: snake_linux en 23 Febrero 2019, 14:51 pm
En la clase Ficheros, no tiene sentido tener campos static para una clase que tiene 1 solo metodo. Esto tiene consecuencias si vas a invocar  a ese metodo mas de 1 vez.

Sugiero que definas todas los campos al interior de ese unico metodo. Con esto, cada vez que invoques ese metodo tendras versiones frescas de lo que creas y no estaras pisando lo anterior.


Muchas gracias! ese era el problema.