Objeto se sobrescribe en otro.

Iniciado por snake_linux, 23 Febrero 2019, 12:55 PM

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

snake_linux

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:


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.

animanegra


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.


42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.

snake_linux

Cita de: animanegra en 23 Febrero 2019, 13:03 PM

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:


miPokemon= new Pokemon(nombrePokemon, pociones, antidotos, ataques);

CalgaryCorpus

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.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

snake_linux

Cita de: 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.


Muchas gracias! ese era el problema.