Autor Tema: Reutilización de código Java crear clases útiles en distintos programas CU00665B  (Leído 7495 veces)

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola!!

EJERCICIO

Citar
Crea una clase denominada ListaCantantesFamosos que al ser inicializada contenga un ArrayList con tres Strings que sean el nombre de cantantes famosos. Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos, pida dos cantantes famosos más al usuario, los añada a la lista y muestre el contenido de la lista por pantalla.

Código: [Seleccionar]
import java.util.ArrayList;

public class ListaCantantesFamosos {

    private ArrayList<String> listaCantantes;
    //constructor que inicializa el objeto listaCantantes y agrega 3 cantantes(strings)
    public ListaCantantesFamosos () {
        listaCantantes = new ArrayList<String>();
        listaCantantes.add("Bono"); listaCantantes.add("Freddie Mercury"); listaCantantes.add("Shakira");
    }
    //metodo para agregar otros strings
    public void addCantante (String nombre) { listaCantantes.add(nombre); }
    //metodo que devuelve todo el contenido del ArrayList listaCantantes
    public void getListaCompleta () {
        System.out.println("Mostrando lista completa...");
        for (int n = 0 ; n < listaCantantes.size() ; n++) {
            System.out.println("Cantante "+(n+1)+" : "+listaCantantes.get(n));
        }
    }
}

Código: [Seleccionar]
public class Test {
   
    public static void main (String[] args) {
       
        System.out.println("ingrese un cantante");
        EntradaDeTeclado entrada1 = new EntradaDeTeclado();
        System.out.println("ingrese otro cantante");
        EntradaDeTeclado entrada2 = new EntradaDeTeclado();
        ListaCantantesFamosos lista = new ListaCantantesFamosos();
        //agregando el primer cantante ingresado al objeto lista
        lista.addCantante(entrada1.getEntrada());
        //agregando el segundo cantante ingresado al objeto lista
        lista.addCantante(entrada2.getEntrada());
        //metodo que nos devuelve todo el contenido del objeto lista
        lista.getListaCompleta();
    }
}

Gracias!!
« Última modificación: 16 de Julio 2015, 17:22 por Alex Rodríguez »

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:Clase ArrayList del api Java (CU00665B) Ejercicio Resuelto
« Respuesta #1 en: 14 de Julio 2015, 20:29 »
Hola Adrián:

Te olvidaste de subir la clase EntradaDeTeclado. Publícala así puedo ver el código completo.

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Re:Clase ArrayList del api Java (CU00665B) Ejercicio Resuelto
« Respuesta #2 en: 14 de Julio 2015, 21:43 »
Hola RaGa, agrego lo que me falta.

Gracias!

Código: [Seleccionar]
import java.util.Scanner;

public class EntradaDeTeclado {
    private String entradaTeclado;

    public EntradaDeTeclado ()  { //Constructor
        entradaTeclado="";
        pedirEntrada(); //Llamada al método interno
    } //Cierre del constructor

    public void pedirEntrada ()  {  //Método de la clase         
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine ();     } //Cierre del método pedirEntrada

    public void setEntrada (String entradaTeclado)  {
        this.entradaTeclado=entradaTeclado;
    }

    public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada
} //Cierre de la clase
« Última modificación: 14 de Julio 2015, 22:48 por adrit »

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:Clase ArrayList del api Java (CU00665B) Ejercicio Resuelto
« Respuesta #3 en: 15 de Julio 2015, 15:59 »
Hola Adrián!

Ahora si pude probar el código completo.
El ejercicio está muy bien! cumple con la consigna del ejercicio.

También quisiera hacer una observaciones para tener en cuenta:

En la clase TecladoEntrada al método setEntrada tal como está no le encuentro ninguna utilidad, ni para este ejercicio, ni para una posible ampliación futura.
Está muy bien tener métodos set y get para los campos de instancia de las clases, pero en este caso el establecimiento del campo entradaTeclado está dado precisamente por el método que denominaste pedirEntrada().

Otra cosa en esta clase:
Ten en cuenta que puedes declarar e inicializar el campo entradaTeclado como lo hiciste en tu código, pero es más correcto declararlo además con su tipo y con su ámbito.

Código: [Seleccionar]
private String entradaTeclado = "";
A seguir adelante!

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Re:Clase ArrayList del api Java (CU00665B) Ejercicio Resuelto
« Respuesta #4 en: 15 de Julio 2015, 16:26 »
RaGa, gracias por tu revisión y devolución.

Quiero hacer dos observaciones:

1) La clase EntradaDeTeclado es la misma que estoy usando en otros ejercicios mas avanzados del curso.

El metodo setEntrada tiene utilidad en el próximo ejercicio, o por lo menos fue mi intención en dicho código :).

Para ser mas prolijo ahora estoy usando paquetes (uno para cada ejercicio), y así no generalizar tanto algunas clases que se pueden reutilizar, como por ejemplo EntradaDeTeclado.

Me pareció una buena idea reutilizar código, pero en este caso fue un desprolijidad mía, perdón.


2) Al decir que es más correcto declarar el campo además con su tipo y con su ámbito.
A que te referis? Tengo que inicializarlo ni bien lo declaro?

Es decir:

private String entradaTeclado;  //no recomendable

private String entradaTeclado = ""; //recomendable
« Última modificación: 16 de Julio 2015, 17:18 por Alex Rodríguez »

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:Clase ArrayList del api Java (CU00665B) Ejercicio Resuelto
« Respuesta #5 en: 15 de Julio 2015, 22:28 »
Hola Adrián:

1) Cuando pensamos en crear una clase hay que preguntarse "qué es" o "para qué servirá" esa clase. Acto seguido consideraremos qué atributos serán necesarios  (sus propiedades) y con qué métodos se regirá el comportamiento de los objetos que pertenezcan a esta clase.
 
Supongamos la clase Persona con atributos: nombre, apellido, género, edad, altura, peso, y profesión. Y sus métodos: establecer y retornar cada atributos, y mostrar por consola dichos atributos.
No sería correcto establecer un método dentro de la clase Persona que devuelva un índice con fines estadísticos donde se relacione el género, con la edad, el peso, y altura (por más que todos sean atributos del objeto tipo Persona).
No podemos delagar a la clase (Persona) lo que parece ser responsabilidades de otra clase.

Lo que se debería hacer en ese caso -estamos suponiendo- es crear una nueva clase llamada por ejemplo CalculadorEstadisticoDePoblacion que contenga un atributo ArrayList de objetos tipo Persona, y donde uno de sus métodos sea justamente ese método que devuelve un índice que relaciona el género, la edad, el peso, y la altura de cada objeto del ArrayList.

Entonces, volviendo a nuestro caso de interés que es la clase EntradaDeTeclado: si el objeto es tipo EntradaDeTeclado, el atributo entradaTeclado debe ser establecido únicamente por lo que tipeamos por teclado. No podemos establecer el atributo entradaTeclado ni con un parámetro recibido, ni tomando un valor leído en un archivo, ni por el valor leído en un puerto, etc etc. Debe existir una correlación entre el nombre de la clase y lo que ella representa, debe existir una coherencia entre qué es, y para qué sirve.
No debemos responsabilizar a esta clase, con responsabilidades que seguramente son atribuibles a otra clase.

Lo de la reutilización del código está perfecto! Esa es la idea: crear clases bien diseñadas que luego las podamos volver a utilizar en otros programas.
Una clase que gestione las entradas por teclado siempre será útil y te ahorrará tiempo de programación.
Por eso quiero que se entienda bien: la observación no está relacionada por el hecho de que no se utilicen todos los métodos de la clase, sino que apuntaba a lo conceptual de qué responsabilidades tiene una clase.
Si tu clase EntradaDeTeclado tuviera también métodos para leer y devolver no solo objetos tipo String, sino otros métodos para leer y devolver objetos tipo Long, tipo Float, tipo Integer, etc, estaría muy bien! por más que no se utilizaran siempre.

2) Codificaste el Constructor de la clase de la siguiente manera:

Código: [Seleccionar]
public EntradaDeTeclado ()  {
        entradaTeclado="";
        pedirEntrada(); //llamada al metodo interno
    }

a la línea :

Código: [Seleccionar]
entradaTeclado="";
sería mas correcto escribirla:

Código: [Seleccionar]
private String entradaTeclado="";
donde queda establecido el ámbito 'private', y establecido el tipo 'String' del atributo entradaTeclado.

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Re:Clase ArrayList del api Java (CU00665B) Ejercicio Resuelto
« Respuesta #6 en: 15 de Julio 2015, 22:47 »
Hola!,

1) Me quedo super claro!!

2) Sigo confundido, ya que la variable entradaTeclado la declaré como variable de campo, es decir fuera del constructor. Dentro de este solo la estoy inicializando, por eso mi confusion. No interpreto si la tengo que declarar fuera (como está hecho) o dentro del metodo constructor.

Actualmente está así:

Código: [Seleccionar]
public class EntradaDeTeclado {
    private String entradaTeclado;

    public EntradaDeTeclado ()  { //Constructor
        entradaTeclado="";
        pedirEntrada(); //Llamada al método interno
    } //Cierre del constructor


Tu propuesta sería:

Código: [Seleccionar]
public class EntradaDeTeclado {
   
    public EntradaDeTeclado ()  { //Constructor
        private String entradaTeclado="";
        pedirEntrada(); //Llamada al método interno
    } //Cierre del constructor

Es correcto?

Gracias!


RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:Clase ArrayList del api Java (CU00665B) Ejercicio Resuelto
« Respuesta #7 en: 15 de Julio 2015, 23:03 »
Hola Adrián:

Hago mea culpa: se me pasó por alto que estaba declarado como campo de instancia, en un golpe de vista no lo ví y creí que nunca lo habías hecho. Perdón, creo que necesito cambiar los cristales de mis anteojos jejeje  ;D

Es absolutamente correcto tal como lo hiciste declarándolo como campo de instancia ya que es un atributo utilizado por más de un método. Luego si, inicializarlo en el Construcor.

Código: [Seleccionar]
public class EntradaDeTeclado {
    private String entradaTeclado;

    public EntradaDeTeclado ()  { //Constructor
        entradaTeclado="";
        pedirEntrada(); //Llamada al método interno
    } //Cierre del constructor

A seguir adelante entonces!

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Re:Clase ArrayList del api Java (CU00665B) Ejercicio Resuelto
« Respuesta #8 en: 15 de Julio 2015, 23:18 »
jajaja perfecto!

Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".