Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - toni_apr

Páginas: 1 2 3 [4] 5 6 7 8 9 ... 25
61
Hola Eduardo

Tu ejercicio está muy bien. Y cumple todas las peticiones del enunciado. OK

Quiero darte unos apuntes para mejorar el código:

En primer lugar decirte que una de las convenciones de Java se refiere a los nombres de atributos, variables y métodos.
La convención (que no obligación) de bautizar estos objetos con palabras que empiezan con minúscula, y si el nombre es una palabra compuesta, cada una de las siguientes empezará con mayúscula.
Con esta convención tu atributo listadecantantes pasaría a llamarse listaDeCantantes.
Únicamente las clases empiezan con mayúscula, precisamente para diferenciarse de variables y métodos.


En segundo lugar, otra convención es declarar los atributos de una clase como private (salvo raras excepciones)

¿Porque motivo?
Pues para que haya una única forma de gestionar la información sobre el atributo, a saber, sus métodos set y get (que siempre son públicos)


Finalmente, para contribuir a la encapsulación de la información y eficiencia del código deberías colocar el for extendido que tienes repetido en la clase TestListaCantantesFamosos en la clase ListaCantantesFamosos que es la propietaria de la información que manipula ese for extendido.

Es decir crear en la clase ListaCantantesFamosos un método que se podría llamar, no sé, a ver:
    muestrameTodosLosCantantesQueTengoEnMiLista
que usando tu for extendido mostrara la información.
De esta forma cualquier clase puede pedir la lista de cantantes famosos sin tener que escribir código pues ya está incorporado en la clase ListaCantantesFamosos.

Naturalmente al método le puedes dar un nombre más corto, pero siempre descriptivo del trabajo que hace.

Saludos

62
Hola Dan

Creo que tienes que recapitular lo que se ha dicho en este hilo .
En un mensaje previo te motrábamos esta cita
Citar
Forma 2 (trabajando con objetos):

Recibir un objeto y crear un nuevo objeto cuyos atributos sean iguales a los del objeto recibido:

    public void setSalonCasa (SalonCasa objetoSalon) {
        salonCasa = new SalonCasa();
        salonCasa.setNumeroDeTelevisores(objetoSalon.getNumeroDeTelevisores);
        salonCasa.setTipoSalon(objetoSalon.getTipoSalon);
    }

que tú aplicas mal en tu clase Casa.

Dan, si es posible, me gustaría que te plantearas explicarle a un colega imaginario que es lo que hace tu método setSalonCasa(SalonCasa objetoSalon) y que es lo que hace el mismo método de la cita anterior.

Después quiero que te digas a ti mismo que hace este método set en la clase Main que no recibe parámetros
    casita.setSalonCasa();

Cuando tengas respuestas a estas preguntas, volvemos a contactar.
Y si tienes dudas, plantéalas aquí y lo solucionamos. No codifiques por codificar sin entender lo que haces.

Saludos

63
Hola jNillo

Con el código que has enviado me hago una idea de la base de tu proyecto.
Pero para averiguar de donde vienen los errores tendrías que aportar el código relacionado con el error.

Te reenvio las dos clases con pequeños cambios que las hacen más operativas.

Clase GeneroEnumerado
Código: [Seleccionar]
public enum GeneroEnumerado
{
    COMEDIA, ACCION, TERROR, CIENCIAFICCION, GENERO_NO_DEFINIDO;
}

Clase Pelicula
Código: [Seleccionar]
public class Pelicula
{
    private String titulo;
    private String director;
    private int anyo;
    private String sinopsis;
    private GeneroEnumerado genero;

    /** @param Si en el parámetro 'elgenero' pones un texto inválido, se tomará GENERO_NO_DEFINIDO */

    public Pelicula(String eltitulo, String eldirector, int elanyo, String lasinopsis,
    String elgenero)
    {
        // initialise instance variables
        titulo=eltitulo;
        director=eldirector;
        anyo=elanyo;
        sinopsis=lasinopsis;
        genero=decideGenero(elgenero);
        // las dos siguientes líneas se pueden eliminar
        System.out.println("Mostrando los datos al inicializar:");
        mostrarInfoPelicula();
    }

    public GeneroEnumerado getGenero()
    {
        return genero;
    }

    public String getTitulo()
    {
        return titulo;
    }

    public String getDirector()
    {
        return director;
    }

    public int getAnyo()
    {
        return anyo;
    }

    public String getSinopsis()
    {
        return sinopsis;
    }

    public void setGenero(String elGenero)
    {
        genero = decideGenero(elGenero);
    }

    public void setTitulo(String eltitulo)
    {
        titulo=eltitulo;
    }

    public void setDirector(String eldirector)
    {
        director=eldirector;
    }

    public void setAnyo(int elanyo)
    {
        anyo=elanyo;
    }

    public void setSinopsis(String lasinopsis)
    {
        sinopsis=lasinopsis;
    }

    public void mostrarInfoPelicula()
    {
        // put your code here
        System.out.println("Pelicula: <"+titulo+">");
        System.out.println("Director: <"+director+">");
        System.out.println("Anyo: <"+anyo+">");
        System.out.println("Sinopsis: <"+sinopsis+">");
        System.out.println("Género por nombre: <"+genero.name()+">");
        System.out.println("Género por método: <"+getGenero()+">");
    }

    private GeneroEnumerado decideGenero(String elgenero) {
        if ( elgenero.equalsIgnoreCase("terror"))
        {
            return GeneroEnumerado.TERROR;
        }
        else if ( elgenero.equalsIgnoreCase("comedia"))
        {
            return GeneroEnumerado.COMEDIA;
        }
        else if ( elgenero.equalsIgnoreCase("accion"))
        {
            return GeneroEnumerado.ACCION;
        }
        else if ( elgenero.equalsIgnoreCase("cienciaficcion"))
        {
            return GeneroEnumerado.CIENCIAFICCION;
        }
        else
        {
            System.out.println("<" + elgenero + "> no es un genero valido");
            return GeneroEnumerado.GENERO_NO_DEFINIDO;
        }       
    }
}
Saludos

64
Hola Lorenzo

Respuestas correctas.

La documentación sobre el API de Java es una biblioteca gigantesca. Tiene todo lo que puesdas imaginar y más.

Gracias a ella podemos aprovechar el código eficiente de los desarrolladores de Java para nuestros proyectos.

Saludos

65
Hola Dan

Citar
La invocación this , o this (parámetros) supone una invocación al constructor que coincida con los parámetros que se pasan para que se ejecute. Al igual que existen formas de invocar a métodos, existen formas de invocar a constructores, y ésta es una de ellas.
La cita anterior corresponde al texto de esta lección. Si lo relees estoy seguro que entenderás porque no te funciona la línea del 'this'.

El IDE BlueJ muestra un texto orientativo cuando el compilador se detienen en esta línea, supongo que NetBeans también la hará.

Saludos

66
Hola calderas

Respuestas correctas. OK

Saludos

67
Hola Lorenzo

Todas las respuestas correctas. OK

Saludos

68
Hola Lorenzo

Las excepciones se suelen usar para controlar mediante código alternativo situaciones que el compilador no puede resolver por sí solo.
Un ejemplo típico es, la división por cero.

Tú siempre puedes usar los recursos de que dispones a tu buen entender. En este caso capturar la excepción particular que se da en tu código. Intentas leer un String más allá de su tamaño.

También puedes codificar sabiendo que ese 'error' ocurrirá con certeza.
Cosa que has hecho en el segundo ejercicio.

También has de saber que se codifica creando excepciones personalizadas. Por ejemplo una excepción que salte cuando un int esté fuera de un rango dado

Por lo tanto las excepciones trabajan para nosotros, no al revés.

Saludos

69
Hola Dan

Envía por favor el código actualizado de tu ejercicio.
Aunque muestras ahora imágenes de los errores, nos falta el código que lo produce para intentar solventarlo.

Saludos

70
Hola Alex

Gacias por tus comentarios. He de decirte que tu escrito no tiene derperdicio para mí.

Tengo claro que dos objetos idénticos cambian al modificar cualquiera de ellos. Para mí son dos puntos de vista (los dos objetos) de un paquete de información único.

Se que la nombrada 'referencia' que da el método toString() no sobreescrito, es una referencia que no podemos controlar, que cambia en cada ejecución.
Para mí es solo una forma visual de comprobar la identidad entre objetos.
Se me hacía más lioso crear una tabla con las relaciones de identidad de cada objeto con el resto de ellos.

Tu clase Test es clarificadora y ejemplarizante. También veo coherencia en la salida mostrada.


Citar
RESPUESTA:

A veces se piensa erróneamente que los tipos primitivos pasan por valor y los objetos por referencia, pero esto no es así. Todo parámetro pasa por valor.

La confusión radica en que cuando pasamos un tipo primitivo, este no es modificable dentro del método. En cambio, al pasar un objeto, sí se pueden producir modificaciones dentro del método. Pero la realidad es que cuando pasamos el parámetro no pasamos el objeto en sí, sino una referencia al objeto, y esta referencia es la que pasa por valor y funciona como una copia dentro del método, resultando que los cambios dentro del método no son conocidos luego fuera de él.

La cita anterior, es maná para mí. Desaloja casi todas las dudas que me planteaba pasar objetos como parámetros.

Y finalmente

Citar
Esto también parece coherente: el método usa como parámetro una copia local de la referencia. Las modificaciones a la referencia no permanecen porque la copia se destruye posteriormente. En cambio, si usamos la referencia para manipular el objeto, dichos cambios sí permanecen porque a través de la copia hemos accedido a modificar el objeto en sí.

En esta cita muestras la diferencia entre 'hacer modificaciones a la referencia' que ha llegado como copia del original, en el método  probarAsignar(Agente agX), y  'usar la propia referencia para modificar el objeto' en el método probarModificar(Agente agX). Cambios estos últimos que si trascienden, aunque esta referencia desaparezca al terminar el método.

He de decirte que no me había planteado (por ignorarlo) usar el parámetro recibido para modificar el objeto original.
Yo simplemente partía de la premisa de que un método set modifica su atributo y  nada más.


Mis conclusiones después de tus aportaciones son:

Los objetos idénticos manipulan el mismo objeto. Cualquier cambio en uno afeca al resto de idénticos.

Los cambios hechos en el parámetro que recibe un método son responsabilidad del programador. Es decir si usa el parámetro para otra cosa que no sea transmitir los datos a los que apunta, allá el programador con sus consecuencias.

Los cambios hechos a un objeto después de haberlo enviado como parámetro a un método. No afectan a los cambios que realizó la copia del objeto dentro del método.
Esta última observación, es la que me planteaba dudas. Y aquí se han desvanecido.

Ejem. Líneas de código sueltas sobre la cuestión:

    personaOriginal.setNombre("Victor");
    objetoPadre.setPersona(personaOriginal);
    ...
    public void setPersona(Persona persona1) {
        persona = persona1;
    }
    ...
    personaOriginal.getNombre() -> devuelve -> "Victor"
    objetoPadre.getPersona.getNombre() -> devuelve -> "Victor"
    ...
    personaOriginal.setNombre("Zenon");
    ...
    personaOriginal.getNombre() -> devuelve -> "Zenon"
    objetoPadre.getPersona.getNombre() -> devuelve -> "Victor"


Creo que no he dicho nada erróneo. Si he hecho suposiciones incorrectas apreciaré que me rectifiques.

Saludos y gracias.

71
Hola Lorenzo

Tus dos soluciones son correctas. OK.
Y en la segunda, ya estás usando la filosofía de Java. Un main director y las clases que realizan el trabajo.

Muy original capturar la excepción cuando una palabra es más corta para mostrar el mensaje adecuado.

Supongo que ya sabes que null y vacío no es lo mismo.
Null es que la variable no se ha inicializado, o se le ha quitado cualquier valor
vacio es, variable inicializada pero con un valor vacío.

Se puede trabajar con valores vacíos pero no con null

Saludos

72
Hola Dan

Tus comentarios son adecuados.

Y tal como dices los atributos que no se usan se podrían eliminar por inútiles.

Saludos

73
Hola emma

Ejercicio correcto. Todo bien.

Saludos y adelante.

74
Hola Dan

Ejercicio correcto.

Esto cada vez es más fácil

Saludos

75
Hola Lorenzo

Si, tienes razón. El código devuelve la primera palabra más es espacio que ha servido para detectarla.

Pero tampoco lo damos por incorrecto. Una palabra es palabra porque al final tiene un espacio, o no hay nada más.
Y el programa en ese caso devuelve todo lo que hemos escrito que se supone será una palabra (sin espacio final).

Saludos

76
Hola Dan

La corrección de tu clase Casa está bien.
Aunque los métodos set de los atributos salonCasa y cocina en lugar de recibir objetos, reciben una cadena de texto y un número

Tu solución es válida, pero como te comentaba Alex, hemos de trabajar con objetos. Java manipula objetos.

En el enlace que te indicaba Alex está esta forma de codificar el método set

Citar
Forma 2 (trabajando con objetos):

Recibir un objeto y crear un nuevo objeto cuyos atributos sean iguales a los del objeto recibido:

    public void setSalonCasa (SalonCasa objetoSalon) {
        salonCasa = new SalonCasa();
   salonCasa.setNumeroDeTelevisores(objetoSalon.getNumeroDeTelevisores);
   salonCasa.setTipoSalon(objetoSalon.getTipoSalon);
    }

Respecto a la respuesta de System.out.println de los métodos get de objetos como Cocina o SalonCasa, es la misma que te dará si pides el contenido de los objetos mismos, pues getSalonCada() devuelve un objeto de tipo SalonCasa.

Cuando pides el valor de un primitivo, para Java es una cosa muy sencilla pues la dirección de esa variable contiene el dato que quieres saber.
En cambio la dirección de un objeto da a un paquete que hay que descifrar y en lugar del objeto te muestra su dirección, ese galimatías con un @ en medio.

Más adelante veremos como codificar para que Java nos muestre eso que tú esperabas ver.

Saludos

77
Hola Lorenzo

Ejercicio correcto.

Puedes ver que hay muchas maneras de hacer un trabajo. Este ejercicio es parecido al anterior.

Habrá momentos en que con todos nuestros recursos diponibles, la experiencia nos aconsejará que método usar para llegar a nuestra meta

Saludos

78
Hola Lorenzo

Ejercicio correcto.

Saludos

79
Gracias Dan y Alex por vuestra atención.

Alex, me voy a tomar mi tiempo para leer tu respuesta y poder contestarte.

Respecto a tu pregunta Dan, primero muestro la signatura del constructor de la clase Persona

    public Persona(String nombre, int edad)

Cuando creamos un objeto de tipo Persona invocando su constructor podemos hacerlo de estas formas:

1- persona = new Persona("Juan",20)
2- persona = new Persona(valorNombre, valorEdad)
3- persona = new Persona(persona1.getNombre(),persona1.getEdad())

En los tres casos lo que hay entre los paréntesis de Persona son dos valores separados por una coma, el primer valor es un texto.
En el caso 1- un texto encerrado entre comillas
En el caso 2- una variable de tipo String que contiene el nombre de la persona
Y en el case 3- hay un método, un getter, que como sabes devuelve un valor.
En este caso es el getter de un objeto de tipo Persona llamado persona1

De la misma forma el método setPersona cuya signatura sería:

    public void setPersona(Persona persona1)

en su interior tiene el código que te extraña. Y que es el tercer caso del constructor citado

Una cosa muy parecida al comentario a tu ejercicio CU00641B

Saludos

80
Hola Lorenzo

Ejercicio correcto.

Está bien que tus programas controlen lo que introduce el usuario.
Aunque parezca mentira, los programas bien hechos incorporan mucho código para chequear las acciones de quien utiliza el programa.

Apunte para mejorar el código:
La línea:
   if(texto.substring(0,1).equals("a") || texto.substring(0,1).equals("A"))
se puede simplificar utilizando el método equalsIgnoreCase(String) que da la misma respuesta para mayúsculas que para minúsculas. Ejem.
    if(texto.substring(0,1).equalsIgnoreCase("a"))

Saludos

Páginas: 1 2 3 [4] 5 6 7 8 9 ... 25

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