Metodo mostrar todos los atributos de un objeto por pantalla(RESUELTO)

Iniciado por Beginner Web, 30 Marzo 2019, 01:57 AM

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

Beginner Web

Buenas mi duda era si habia alguna forma de mostrar todos los atributos de un objeto, porque la verdad me canse de escribir mucho sout y llamar a los metodos Getters, alguna técnica porfis   :-(
7w7

rub'n

Cita de: Beginner Web en 30 Marzo 2019, 01:57 AM
Buenas mi duda era si habia alguna forma de mostrar todos los atributos de un objeto, porque la verdad me canse de escribir mucho sout y llamar a los metodos Getters, alguna técnica porfis   :-(

Puedes sobreescribir el metodo toString() ,pero como tienes el código?


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

Beginner Web

#2
//Este es una clase
public class Persona{
private String nombre;
private int edad;

Constructor va aquí
Getters & Setters aquí
}

//Este es el main
public class Personal{

public static void main(){
Persona objeto1=new Persona("Ana",14);

//Esto es algo tedioso de hacer varios objetos de distintas clases
//Podia crear un metodo en la clase Persona que muestre todo, pero quiero saber si hay otra técnica por defecto
sout para mostrar el nombre de objeto1;
sout para mostrar la edad de objeto1;

}

}


Me parece que me conviene crear metodos en las clases para pedir los datos y otro para mostrarlos asi escribo menos en el main
7w7

rub'n

Cita de: Beginner Web en 30 Marzo 2019, 02:31 AM
//Este es una clase
public class Persona{
private String nombre;
private int edad;

Constructor va aquí
Getters & Setters aquí
}

//Este es el main
public class Personal{

public static void main(){
Persona objeto1=new Persona("Ana",14);

//Esto es algo tedioso de hacer varios objetos de distintas clases
//Podia crear un metodo en la clase Persona que muestre todo, pero quiero saber si hay otra técnica por defecto
sout para mostrar el nombre de objeto1;
sout para mostrar la edad de objeto1;

}

}


Me parece que me conviene crear metodos en las clases para pedir los datos y otro para mostrarlos asi escribo menos en el main


Que tal chavalina? Usa Geshi



Si hay mejores maneras de hacerlo por ejemplo una, lo que necesitas es algo de herencia simple

Código (java) [Seleccionar]

import java.util.logging.Logger;

/**
*
*/
@FunctionalInterface
public interface IPersonal {

   Logger LOGGER =Logger.getLogger(IPersonal.class.getSimpleName());

   void introducirDatos();

   default <T> void mostrar(final T value) {
       System.out.println(value);
   }

   /**
    * usar dentro de un metodo estatico
    * @param value
    * @param <T>
    */
   static <T> void mostrar2(final T value) {
       System.out.println(value);
   }

   default <T> void log(final T t) {
       LOGGER.severe(t.toString());
   }

   /**
    * usar dentro de un metodo estatico
    * @param t
    * @param <T>
    */
   static <T> void log2(final T t) {
       LOGGER.severe(t.toString());
   }
}


Código (java) [Seleccionar]

import java.util.Objects;
import java.util.Scanner;

/**
*
*/
public abstract class AbstractBasePersona implements IPersonal {

   protected String nombre;
   protected int edad;
   protected static final Scanner LEER = new Scanner(System.in);

   public AbstractBasePersona() {
       this.edad = 0;
       this.nombre = "";
   }

   public AbstractBasePersona(final String nombre, final int edad) {
       this.nombre = Objects.requireNonNull(nombre,"Nombre no debe ser null");
       this.edad = Objects.requireNonNull(edad,"Edad no debe ser null");
   }

   public String getNombre() {
       return nombre;
   }

   public void setNombre(String nombre) {
       this.nombre = nombre;
   }

   public int getEdad() {
       return edad;
   }

   public void setEdad(int edad) {
       this.edad = edad;
   }

   @Override
   public void introducirDatos() {
       mostrar("Introduce nombre: ");
       nombre = LEER.next();
       //bug scanner
       LEER.nextLine();
       mostrar("Introduce edad");

       while(!LEER.hasNextInt()) {
           LEER.next();
           mostrar("Valor invalido!, solo numeros");
       }
       edad = LEER.nextInt();

   }

   @Override
   public String toString() {
       final StringBuilder sb = new StringBuilder("\nPersona");
       sb.append("\nNombre: ").append(nombre).append("\n");
       sb.append("Edad: ").append(edad);
       return sb.toString();
   }


}



Código (java) [Seleccionar]

public class PersonalDeInformatica extends AbstractBasePersona {

   private boolean esDeInformatica;

   public PersonalDeInformatica() {
       super();
   }

   public PersonalDeInformatica(final String nombre,final int edad, boolean esDeInformatica) {
       super(nombre,edad);
       this.esDeInformatica = esDeInformatica;
   }

   @Override
   public void introducirDatos() {
       /**
        * Introducir los datos basicos por defecto, Nombre y Edad
        */
       super.introducirDatos();

       // pedimo si es personal de informatica

       mostrar("Personal del Informtica ?");
       esDeInformatica = LEER.nextBoolean();

       //setemos el tipo de persona
       setEsDeInformatica(esDeInformatica);
   }

   public boolean isEsDeInformatica() {
       return esDeInformatica;
   }

   public void setEsDeInformatica(boolean esDeInformatica) {
       this.esDeInformatica = esDeInformatica;
   }

   @Override
   public String toString() {
       final StringBuilder sb = new StringBuilder();
       sb.append(super.toString());
       sb.append("\nEs de informatica ? ").append(esDeInformatica);
       return sb.toString();
   }
}



Código (java) [Seleccionar]

/**
*
*/
public class PersonalDeLimpieza extends AbstractBasePersona {

   private boolean esDeLimpieza; //por defecto la variable de instancia boolean, es false

   public PersonalDeLimpieza() {
       super();
   }

   public PersonalDeLimpieza(final String nombre, final int edad, final boolean esDeLimpieza) {
       super(nombre,edad);
       this.esDeLimpieza = esDeLimpieza;
   }

   public boolean isEsDeLimpieza() {
       return esDeLimpieza;
   }

   public void setEsDeLimpieza(boolean esDeLimpieza) {
       this.esDeLimpieza = esDeLimpieza;
   }

   @Override
   public void introducirDatos() {
       //invocamo al introducir datos de la superClaseAbstracta
       super.introducirDatos();

       // pedimo si es personal de limpieza

       mostrar("Personal del limpieza ?");
       esDeLimpieza = LEER.nextBoolean();

       //setemos el tipo de persona
       setEsDeLimpieza(esDeLimpieza);

   }

   @Override
   public String toString() {
       final StringBuilder sb = new StringBuilder();
       sb.append(super.toString());
       sb.append("\nPersonal de Limpieza ? ").append(isEsDeLimpieza()).append("\n");
       return sb.toString();
   }

}




Código (java) [Seleccionar]

import java.util.LinkedList;

/**
*
*/
public class Principal {

   private final LinkedList<IPersonal> iPersonalLinkedList = new LinkedList<>();


   public Principal() {
       init();
   }

   private void init() {

       final PersonalDeLimpieza personalDeLimpieza = new PersonalDeLimpieza();
       personalDeLimpieza.introducirDatos();

       final PersonalDeInformatica personalDeInformatica = new PersonalDeInformatica();
       personalDeInformatica.introducirDatos();

       /**
        * Anadimos a todos los objetos que extienden/implementan a IPersonal
        * para procesarlos de manera polimorfica gracias, a que cada uno,
        * sobreEscribe a toString().
        */
       iPersonalLinkedList.add(personalDeLimpieza);
       iPersonalLinkedList.add(personalDeInformatica);

       /**
        * Se invocara al metodo toString() de cada Objeto, implicitanmente
        */
       //java 8
       iPersonalLinkedList.forEach(e -> e.mostrar(e));

       //java 7
       /*for(IPersonal tmp : iPersonalLinkedList) {
           tmp.mostrar(tmp.toString());
       }*/

   }

   public static void main(String ...blabla) {
       new Principal();
   }
}


Salida

Código (bash) [Seleccionar]
Introduce nombre:
Ana
Introduce edad
14
Personal del limpieza ?
false
Introduce nombre:
rubn
Introduce edad
30
Personal del Informtica ?
true

Persona
Nombre: Ana
Edad: 14
Personal de Limpieza ? false


Persona
Nombre: rubn
Edad: 30
Es de informatica ? true

Process finished with exit code 0


Un ejemplo sencillo, luego chekeate el patrón Builder  >:D , y Abstract Generic Builder , con interfaces también (te aseguro que te gustara, y trabajaras mejor con inmutabilidad)


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

CalgaryCorpus

No deberias gastar tiempo en escribir los getters / setters o el metodo toString(). Los editores deberian hacerlo por ti. IntelliJ lo hace, al menos.

Otra alternativa es ni siquiera escribir el codigo, sino anotar la clase y que magicamente esos metodos se escriban y existan aunque no los veas. AutoValue y Lombok son 2 exponentes de esto.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

rub'n

Cita de: CalgaryCorpus en 30 Marzo 2019, 15:55 PM
No deberias gastar tiempo en escribir los getters / setters o el metodo toString(). Los editores deberian hacerlo por ti. IntelliJ lo hace, al menos.

Otra alternativa es ni siquiera escribir el codigo, sino anotar la clase y que magicamente esos metodos se escriban y existan aunque no los veas. AutoValue y Lombok son 2 exponentes de esto.

Magicamente? o gracias a Reflection vía anotaciones? generando codigo en runtime, la chavala esta aprendiendo, por eso mi ejemplo.

Aunque me falto decirle eso. yo genere getters/setters/toString() con intelliJIDea, eclipse también lo hace, netBeans me imagino que también debería.

@CalgaryCorpus seria bueno que le pusieras un ejemplo de Project Lombok para que la ayudes.

Y de paso ah dia de hoy grandes Frameworks webs de java, potentes, tienen su implementacion de toString() sin api de terceros como lombok entre otras, de paso que toString() sirve para no mostrar el codigo hash directamente a alguien que espie dichos objetos.


@Beginner Web , creas las variables de instancia que quieras, luego, teclas Alt + insertar, debería aparecerte este cuadro de contexto con las opciones que se muestran, no aparece toString() porque ya lo use, versión de NetBeans que tengo

   * Product Version: NetBeans IDE 8.2 (Build 201610071157)





rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

Beginner Web

7w7