Autor Tema: ¿Por qué no se deben declarar los métodos Java como static sino public? CU00665B  (Leído 3322 veces)

Pasandav

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Mi solución al ejercicio CU00665B.

Espero consejos y opinión. Gracias.

Código: [Seleccionar]
import java.util.ArrayList;
/**
 * Write a description of class ListaNombres here.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class ListaCantantesFamosos
{
    // Esta clase representa una lista de nombres manejada con la clase ArrayList de Java
    private String nombreDeCantante; // Establecemos atributo nombre de la lista.
    private ArrayList <String> listaDeCantantes; // Declaramos un ArrayList que contiene objetos String.
   
    public ListaCantantesFamosos () // Constructor, crea una lista y añade 3 nombres
    {
        listaDeCantantes = new ArrayList <String> ();
        listaDeCantantes.add ("Michael Jackson");
        listaDeCantantes.add ("Juan Luis Guerra");
        listaDeCantantes.add ("Juanes");
    } // Cierre del constructor.
   
    public void añadeDatos (String valor_nombre) { listaDeCantantes.add (valor_nombre); } // Cierre del metodo.
   
    public String getNombre (int posicion)   // Método que devuelve el nombre almacenado en posicion.
    {
        if (posicion >= 0 && posicion < listaDeCantantes.size()) 
        {
            return listaDeCantantes.get (posicion);
        }
        else
        {
            return "No existe nombre para la posición solicitada";
        }
    }
       
    public int getTamaño() { return listaDeCantantes.size(); }  // Metodo que devuelve el tamaño de la lista.
}   //Cierre de clase


Código: [Seleccionar]
import java.util.Scanner;
/**
 * Write a description of class RegistroTeclado here.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class RegistroTeclado
{
    String teclado; // Variable para crear objeto Scanner.
   
    public  RegistroTeclado()   // El constructor llama al metodo que crea el objeto Scanner
    {
        solicitudEntradaTeclado();
    }
   
    static String solicitudEntradaTeclado() // Metodo que crea el objeto Scanner.
    {
       Scanner teclado = new Scanner (System.in);
       String registroTeclado = teclado.nextLine();
       return registroTeclado;   // Devuelve el texto introducido como String
    } 
}


Código: [Seleccionar]
/**
 * Clase que muestra los mensajes por pantalla.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class VisualizadorDeMensajes
{   
    public VisualizadorDeMensajes()
    {     
    }
   
    static void solicitudDeDatos(int veces,String tipoDeDatos)   // Recibe las veces y el tipo de datos a mostrar.
    {
       System.out.println("Por favor, introduzca nombre de el/la " + veces + " " + tipoDeDatos);    // Los muestra en pantalla.
    }
   
    static void listaDeCantantes(int posicion,String nombre)    // Recibe la posicion en la lista y el dato introducido.
    {
      System.out.println("Posición de la lista " + posicion + " " + nombre.toUpperCase() );  // Lo muestra en Mayusculas.
    }     
}


Código: [Seleccionar]
/**
 * Introducir datos en una Lista.
 *
 * @author (David Martínez)
 * @version (1.0 - (18-10-2015)
 */
public class TestCantantesFamosos   // Inicio de la clase
{
    public TestCantantesFamosos()   // Constructor (sin parametros).
    { }
   
    public static void main (String [] args)    // Inicio de Main
    {
        ListaCantantesFamosos Lista = new ListaCantantesFamosos (); // Creamos objeto Lista de la clase ListaCantantesFamosos.
     
        for (int numeroDeDatos=1; numeroDeDatos<3 ; numeroDeDatos = numeroDeDatos + 1) // Bucle que pide los nombres y los añade a la lista.
        {
             VisualizadorDeMensajes.solicitudDeDatos(numeroDeDatos,"Cantante"); //Llama al metodo solicitudDeDatos, enviando el nº de datos y el tipo de datos.
             String nombre = RegistroTeclado.solicitudEntradaTeclado ();    // Almacena el dato devuelto en la variable nombre.
             Lista.añadeDatos (nombre); // Añade el nombre al objeto Lista mediante el metodo añadeDatos.
        }
       
        for (int posicionLista = 0; posicionLista < (Lista.getTamaño()); posicionLista = posicionLista +1)  // Bucle que recorre la lista y muestra sus datos.
        {
            VisualizadorDeMensajes.listaDeCantantes (posicionLista,Lista.getNombre(posicionLista));
        }
   
    }   // Fin de Main
}   // Fin de la clase
« Última modificación: 22 de Octubre 2015, 09:34 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola David, la separación del código en clases la estás planteando por el buen camino, todavía tendrás que ir mejorando pero en general el diseño separado en clases te sirve para manejar los conceptos de la programación orientada a objetos. Te comento algunos detalles a mejorar:

Incoherencia: tener un atributo en la clase ListaCantantesFamosos denominado nombreDeCantante. Ese atributo debería llamarse nombreDeLaLista.

private String nombreDeCantante; // Establecemos atributo nombre de la lista.

Preferible no usar eñes en nombres de atributos, clases o métodos. Por eso es mejor addDatos que añadeDatos

Los métodos en general deben ser public y no void, por ejemplo:

Mal: static void solicitudDeDatos(int veces,String tipoDeDatos)

Bien: public void solicitudDeDatos(int veces,String tipoDeDatos)

De este modo, para invocar un método antes tienes que crear un objeto usando new (no podrás hacerlo invocando directamente VisualizadorDeMensajes.solicitudDeDatos(...) ). ¡En la programación orientada a objetos se trabaja creando objetos, solo en algunas circunstancias especiales no se hace así!

En un bucle el incremento de la variable del bucle no se suele escribir como numeroDeDatos = numeroDeDatos + 1 sino como numeroDeDatos++

Saludos

Pasandav

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Agradezco tu ayuda.

Creo que he arreglado todo lo que me comentas.
Algunos cambios en VisualizadorDeMensajes son porque utilizo este clase en los dos ejercicios siguientes.

No consigo sacar el objeto muestraEnPantalla de la clase VisualizadorDeMensajes de la clase RegistroTeclado.seguirIntroduciendoDatos. (Simplemente no sé como se hace).
Por la misma razón, no consigo sacar el método listadoCompleto de la clase ListaCantantesFamosos....

Gracias de nuevo por todo, te pongo las modificaciones y espero no meter mucho la gamba :D:

Código: [Seleccionar]
/**
 * Introducir datos en una Lista.
 *
 * @author (David Martínez)
 * @version (1.1 - (23-10-2015)
 */
public class TestCantantesFamosos   // Inicio de la clase
{
    public TestCantantesFamosos()   // Constructor (sin parametros).
    { }
   
    public static void main (String [] args)    // Inicio de Main
    {
        ListaCantantesFamosos Lista = new ListaCantantesFamosos (); // Creamos objeto Lista de la clase ListaCantantesFamosos.
        VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
        RegistroTeclado teclado = new RegistroTeclado();
       
        for (int numeroDeDatos=1; numeroDeDatos<3 ; numeroDeDatos ++) // Bucle que pide los nombres y los añade a la lista.
        {
             String datos = Integer.toString(numeroDeDatos);
             muestraEnPantalla.solicitudDeDatos(datos,"Cantante"); //Llama al metodo solicitudDeDatos, enviando el nº de datos y el tipo de datos.
             String nombre = teclado.solicitudEntradaTeclado ();    // Almacena el dato devuelto en la variable nombre.
             Lista.addCantanteALista (nombre); // Añade el nombre al objeto Lista mediante el metodo añadeDatos.
        }
       
        for (int posicionLista = 0; posicionLista < (Lista.getTamaño()); posicionLista ++)  // Bucle que recorre la lista y muestra sus datos.
        {
            muestraEnPantalla.listaPosicionYCantante (posicionLista,Lista.getNombre(posicionLista));
        }
   
    }   // Fin de Main
}   // Fin de la clase
Código: [Seleccionar]
/**
 * Clase que muestra los mensajes por pantalla.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class VisualizadorDeMensajes
{   
    public VisualizadorDeMensajes()
    {     
    }
   
    public void solicitudDeDatos(String dato,String tipo)   // Metodo para mostrar mensaje de introducción de datos
    {
       System.out.println("\nPor favor, introduzca " + dato + " de " + tipo +".");
    }
   
    public void listaCantanteYDisco(String nombre,String disco)    // Muestra el dato de ArrayList de situado en "posicion" y "nombre"
    {
      System.out.println("Cantante: " + nombre.toUpperCase() + "  Disco con más ventas: " + disco.toUpperCase() ); 
    }   
   
    public void volverAIntoducirDatos(String dato,String tipo) // Muestra la pregunta de seguir introduciendo datos.
    {
    System.out.println("¿Desea introducir "+ dato + " de otro/a " + tipo +"? (S/N): ");
    }
    public void entradaIncorrecta() // Muestra que hay que introducir o S o N.
    {
        System.out.println("Por favor, responda (S/N): ");   
    }
    public void encabezadoDeLista(String tipo) // Muestra el encabezado de la lista.
    {
     System.out.println("La lista " + tipo + " contiene los siguientes datos:" ); 
    }
    public void solicitudDeDisco()    // Muestra la solicitud de introducir Disco.
    {
        System.out.println("Disco con más ventas:");
    }
   
    public void listaPosicionYCantante (int posicion,String nombre)
    {
       System.out.println("En posicion: " + posicion + " - " + nombre ); 
   
    }
   
}
Código: [Seleccionar]
import java.util.Scanner;
/**
 * Write a description of class RegistroTeclado here.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class RegistroTeclado
{
    String teclado; // Variable para crear objeto Scanner.
    VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
   
    public  RegistroTeclado()   // El constructor llama al metodo que crea el objeto Scanner
    {
    }
   
    public String solicitudEntradaTeclado() // Metodo que crea el objeto Scanner.
    {
       Scanner teclado = new Scanner (System.in);
       String registroTeclado = teclado.nextLine();
       return registroTeclado;   // Devuelve el texto introducido como String
    } 
   
    public int seguirIntroduciendoDatos(String seguir) // Comprueba si se introduce "s", "n" u otra letra
    {
        int respuesta=0;
       
        do{ // Bucle que se repite, mientras "respuesta = 0".
            if (seguir.equalsIgnoreCase("s")) { respuesta = 1;}   // si se recibe "s" respuesta = 1 (Se introducen más datos.
            else if (seguir.equalsIgnoreCase("n")){ respuesta = 2;}   // Si se recibe "n" respuesta = 2 (No se introducen más datos.
            else {
                    muestraEnPantalla.entradaIncorrecta(); // Si no es ni "s" ni "n", Se muestra mensaje aclaratorio.
                    seguir = solicitudEntradaTeclado().toLowerCase();   // Se vuelve a socilitar la introdución de datos.
                 }
        } while (respuesta==0); // Fin de Do-While.
   
        return respuesta;   // Devuelve el valor de "respuesta" (1 o 2)
    }
   
}
Código: [Seleccionar]
import java.util.ArrayList;
/**
 * Write a description of class ListaNombres here.
 *
 * @author (David Martínez)
 * @version (a version number or a date)
 */
public class ListaCantantesFamosos
{
    private ArrayList <String> listaDeCantantes; // Declaramos un ArrayList que contiene objetos String.
    VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
   
    public ListaCantantesFamosos () // Constructor, crea una lista y añade 3 nombres
    {
       
        listaDeCantantes = new ArrayList <String> ();
        listaDeCantantes.add ("Michael Jackson");
        listaDeCantantes.add ("Juan Luis Guerra");
        listaDeCantantes.add ("Juanes");
    } // Cierre del constructor.
   
    public void addCantanteALista (String nombreCantante) // Añade al ArrayList el nombre introducido.
    {
        listaDeCantantes.add (nombreCantante);
    } // Cierre del metodo.
   
    public String getNombre (int posicion)   // Método que devuelve el nombre almacenado en "posicion".
    {
        if (posicion >= 0 && posicion < listaDeCantantes.size()) 
        {
            return listaDeCantantes.get (posicion);
        }
        else
        {
            return "No existe nombre para la posición solicitada";
        }
    }
   
    public void listadoCompleto()   // Metodo que recorre todo el ArrayList y lo visualiza en pantalla
    {
        int posicion = 0;
        for (String nombre:listaDeCantantes)
        {
        muestraEnPantalla.listaPosicionYCantante (posicion,nombre);
        posicion ++;
        }   
    }
   
   
    public int getTamaño()  // Metodo que devuelve el tamaño de la lista.
    {
        return listaDeCantantes.size();
    }  // Metodo que devuelve el tamaño de la lista.
}   //Cierre de clase

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola David la idea es aprender bien más que aprender rápido, por eso puede ser conveniente detenerse, incluso volver atrás y repasar temas ya vistos cuando sea necesario.

Otra cosa interesante es repasar los ejercicios comentados en los foros, analizando esos ejercicios y leyendo los comentarios podrás aprender muchas cosas útiles. Para ello simplemente introduce el código del ejercicio en el buscador y revisa comentarios de otros compañeros.

El método public int seguirIntroduciendoDatos(String seguir) simplemente no debería estar en la clase RegistroTeclado. La clase RegistroTeclado simplemente se tiene que preocupar de representar una entrada de teclado. Una entrada de teclado no se preocupa de si el usuario debe seguir introduciendo datos, simplemente ha de representar una entrada de teclado. ¿Dónde debería estar entonces ese código? A falta de un sitio específico, en la clase con el método main.

Saludos

Pasandav

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
!Bufff!
Creía que había que sacar el máximo de métodos fuera de el main.
Yo personalmente, le veo "cierta" lógica a que la clase registraTeclado analice si son correctas las introducciones de teclado (voy a tener que cambiar mi forma de dar lógica a las cosas).

¡¡A mandar!!

Muchas gracias por todos los consejos.....!!Sigo!!

 

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".