Arreglo de inmuebles

Iniciado por Omar_2013, 18 Febrero 2015, 21:30 PM

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

Omar_2013

Hola, estoy haciendo un programa pero tengo un error en la implementación de mi código y no se cual es, lo que pasa es que escogiendo la opción 2(Mostrar Inmuebles), sale para cada inmueble el mismo propietario.

Estas son las Clases

Código (java) [Seleccionar]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class TestPropietario {

private static Inmueble ArregloI[]=new Inmueble[5];

public static void Imprimir(int Pos) throws IOException{
System.out.println("\nPropietario " + ArregloI[Pos].getMiPropietario().getNombreCompleto() + ":\n");
System.out.println("Estado " + ArregloI[Pos].getEstado() + "\n");
}

public static int MenuPrincipal() throws IOException{
int Opcion=0;
BufferedReader Lector = new BufferedReader(new InputStreamReader(System.in));
String Capturar;

System.out.println("\n1. Ingresar un inmueble\n");
System.out.println("2. Mostrar Inmuebles\n");
System.out.println("3. Salir\n");

Capturar= Lector.readLine();
Opcion=Integer.parseInt(Capturar);
return Opcion;
}


public static void main(String[] args) throws IOException{

int OpcionM=0, Cont=0;
Propietario AuxProp= new Propietario(null, null);
String Estado = null;

BufferedReader Lector = new BufferedReader(new InputStreamReader(System.in));
String Capturar;

for(int i=0; i<5; i++)
ArregloI[i]= new Inmueble();

while(OpcionM!=3){

OpcionM=MenuPrincipal();

switch(OpcionM){
case 1:
System.out.println("Ingrese el Estado del Inmueble (Libre - Ocupado)");
Capturar= Lector.readLine();
Estado=Capturar;

System.out.println("Ingrese el Nombre del Propietario");
Capturar= Lector.readLine();
AuxProp.setNombreCompleto(Capturar);

System.out.println("Ingrese el numero de telefono del propietario");
Capturar= Lector.readLine();
AuxProp.setTelContac(Capturar);

if(Cont<5){
ArregloI[Cont].Llenar(Estado, AuxProp);
Cont+=1;
}
else
System.out.println("Ha llegado al límite máximo de Inmuebles");
break;
case 2:
for(int i=0; i<5; i++)
Imprimir(i);
break;
case 3:
break;
}
}


}




Código (java) [Seleccionar]


public class Propietario {
private String NombreCompleto;
private String TelContac;


public Propietario(String nombreCompleto, String telContac) {
NombreCompleto = nombreCompleto;
TelContac = telContac;
}


public String getNombreCompleto() {
return NombreCompleto;
}


public void setNombreCompleto(String nombreCompleto) {
NombreCompleto = nombreCompleto;
}


public String getTelContac() {
return TelContac;
}


public void setTelContac(String telContac) {
TelContac = telContac;
}

}




Código (java) [Seleccionar]


public class Inmueble {
private String Estado;
private Propietario MiPropietario=new Propietario(null, null);


public void Llenar(String Estado, Propietario MiPropietario){
setEstado(Estado);
setMiPropietario(MiPropietario);
}

public Inmueble() {
}

public String getEstado() {
return Estado;
}
public void setEstado(String estado) {
Estado = estado;
}
public Propietario getMiPropietario() {
return MiPropietario;
}
public void setMiPropietario(Propietario miPropietario) {
MiPropietario = miPropietario;
}
}


Verán, al momento ingresar a la opción 2 después de haber llenado 2 inmueble sale algo así:


Usuario Invitado

#1
Primero tienes que entender bien la POO para poder aplicarla. Te explicaré un poco.

Ésta línea:

Código (java) [Seleccionar]
Propietario AuxProp= new Propietario(null, null);

Lo que hace es crear una instancia de la clase Propiertario. A partir de ahora, AuxProp es un objeto que guarda una referencia. Hay dos estados en la creación de objetos:

  • Declaración
  • Instanciación




    PARTE 1: DECLARACIÓN



    Código (java) [Seleccionar]
    Propietario auxProp;.

    Éste objeto le indica al compilador que es un objeto tipo Propietario pero que aún no es instanciado. Es como si Lamborgini creara un plano de un nuevo automóvil, el plano indica que dicho plano es de tipo X Modelo, pero aún no ha sido creado, por lo que ese plano no tiene utilidad hasta que se construya.

    Volviendo a tu código, auxProp aún no ha sido construido, está en "espera". En éste punto, el objeto auxProp tiene una referencia que la VM le asigna por defecto a los objetos sin instanciar, que es NULL. Un valor NULL significa que no hace referencia a absolutamente nada.

    PARTE 2: INSTANCIACIÓN



    En ésta parte se construye el objeto tipo Propietario con la palabra reservada new. Pon especial atención en ésta palabra. En Java y en todos los lenguajes de alto nivel, la palabra new hace que se construya una representación de una clase y dicha representación tendrá los atributos y métodos/funciones de dicha clase. Ésto es ahora una instancia, un objeto funcional.

    Al instanciar un objeto con new, la VM le asigna una dirección en memoria y dicho objeto siempre hará referencia a esa dirección en memoria. Cuando tu uses auxProp en realidad estás llamando al objeto que tienes almacenado en algún espacio de memoria. Entender ésto es muy importante.

    Como ya has creado e instanciado tu objeto tipo Propietario, se le ha asignado una dirección en memoria. Ahora, cuando tu haces:

    Código (java) [Seleccionar]
    AuxProp.setNombreCompleto(Capturar);

    Las veces que hagas eso, le estarás cambiando el nombre al mismo objeto. Si ese mismo objeto Propietario lo guardas en 5 objetos Immueble, los cinco objetos Propietario en los 5 objetos Immueble serán el mismo. Por ésta razón, cuando le cambias en nombre al objeto 1, 2, 3, 4 o 5, al imprimir los objetos Propietario te mostrará la misma información, por la razón que es el mismo objeto en memoria.

    Lo que tienes que hacer es simplemente eliminar la declaración del objeto auxProp del main y colocarlo dentro del case 1 del switch. De ésta manera:

    Código (java) [Seleccionar]
    System.out.println("Ingrese el Estado del Inmueble (Libre - Ocupado)");
    String estado = lector.readLine();

    System.out.println("Ingrese el Nombre del Propietario");
    Propietario propietario = new Propietario();
    propietario.setNombreCompleto(lector.readLine());

    System.out.println("Ingrese el numero de telefono del propietario");
    propietario.setTelContac(lector.readLine());

    if(Cont<5){
        ArregloI[Cont].Llenar(Estado, AuxProp);
        Cont+=1;
    }
    else
        System.out.println("Ha llegado al límite máximo de Inmuebles");
    break;



    Así estamos declarando un objeto Propietario cada vez que se elige la opción uno. Por lo que, cada vez que elijas la opción 1, se creará un nuevo objeto Propietario y por lo tanto serán objetos diferentes.

    Como recomendación:

  • Las variables deben empezar por minúscula. Si hay una segunda palabra, ésta debe empezar con mayúscula.
  • Analizar si una variable u objeto va a ser utilizada solo en un pequeño ámbito o si será compartida entre varios procesos. Ésto para evitar crear variables en contextos donde no se van a utilizar y gastar memoria.
  • Empieza a utilizar POO.
  • Leer buenas prácticas en Java
  • Leer Patrones de diseño en Java
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

Omar_2013

Wow que tremenda explicación ;-)  muchas gracias por tu tiempo Gus Garsaky.

Usuario Invitado

De nada amigo mío, cuando gustes ^^

Un salu2.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein