• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

diogo.delgaudio

duvida newbie...

8 mensagens neste tópico

estou tentando fazer um cronometro em java, estou começando agora com java e estou tendo grande dificuldade em quebrar os paradigmas e assimilar a OO :wallbash:... enfim, montei duas classes... a classe Cronometro e a classe Crondados, que é a qual está com os métodos q tem de ser executados... acredito que hajam muitos erros, mas como sou principiante, não consigo listá-los para corrigi-los:

classe Crondados

package cronometro;

/**
*
* @author delgaudio
*/
public class Crondados {
    private int hora;
    private int minuto;
    private int segundo;
    private int i;
    
    /** Creates a new instance of crondados */
    public Crondados(int segundo, int minuto, int hora) {
        this.segundo=segundo;
        this.minuto=minuto;
        this.hora=hora;
        setHora(hora);
        setMinuto(minuto);
        setSegundo(segundo);
    }

    public int getHora() {
        return hora;
    }

    public void setHora(int hora) {
        this.hora = hora;
        if (minuto == 60){
            hora++;
            
        }
    }

    public int getMinuto() {
        return minuto;
    }

    public void setMinuto(int minuto) {
        this.minuto = minuto;
        if (segundo == 60){
            minuto++;
            setSegundo(00);
            
        }
    }

    public int getSegundo() {
        return segundo;
    }

    public void setSegundo(int segundo) {
        this.segundo = segundo;
        for (i=1; i<=60; i++){
            segundo++;
            setMinuto(minuto);
        }
    }
    
}

Cronometro

package cronometro;

/**
*
* @author delgaudio
*/
public class Cronometro  {
    private int hora;
    private int segundo;
    private int minuto;
   
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
      Crondados x = new Crondados(0,0,0);
      x.setSegundo(1);
      
      System.out.printf("%d : %d : %d" , x.getHora() , x.getMinuto()  , x.getSegundo());
    }
    
}

por favor, listem os erros! obrigado!  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este construtor...

    public Crondados(int segundo, int minuto, int hora) {
        this.segundo=segundo;
        this.minuto=minuto;
        this.hora=hora;
        setHora(hora);
        setMinuto(minuto);
        setSegundo(segundo);
    }

Porque é que estás a atribuir duas vezes o mesmo valor às variáveis? É muito boa política usares os métodos de encapsulamento para atribuires os valores mas neste caso estás a atribuir duas vezes o mesmo valor.

Já agora, nos métodos de set, devias estar a validar os valores passados, por exemplo, da forma como está feito, posso dizer que quero um minuto negativo.

De resto, o exemplo é bastante simples, não necessitavas dos dois objectos, mas não há mal em criares os dois, o encapsulamento existe, embora os métodos devessem estar a fazer validações. Em resumo, bom começo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É muito boa política usares os métodos de encapsulamento para atribuires os valores...

Uma citação interessante, visto que me leva a um problema que acontece em C++, e gostava de saber se o mesmo acontece em Java.

Em C++ é necessário ter especial cuidado ao usar funções virtuais no construtor. Como descrito aqui: http://www.artima.com/cppsource/nevercall.html

Sei que em Java não existe distinção, são todas virtuais por defeito. Será que o comportamento é o mesmo? Estou a tentar pesquisar isto sem grandes respostas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entendi, obrigado pelas respostas! alguém pode me mostrar como ficaria corrigido o meu exemplo? :P obrigado, galera!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, esse será um problema de polimorfismo e, pelo que sei, no java esse problema não se coloca, no entanto, não tenho bibliografia que apoie o que estou a dizer. Terei de confirmar, mas penso que estou correcto ao afirmar que não terás esse problema. Entretanto verfico isso.

Quanto a um exemplo corrigido, ao fim do dia, se não te importares de esperar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sem dúvida  não me importo, obrigado Knitter!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

package org.sergiolopes.dd.cronometro;

/**
*
* @author Knitter
*/
public class Crondados {
    
    private int hora;
    private int minuto;
    private int segundo;
    
    public Crondados(int segundo, int minuto, int hora) {
        setHora(hora);
        setMinuto(minuto);
        setSegundo(segundo);
    }

    /* Construtor por omissao, apenas por conveniencia */
    public Crondados() {
        this(0, 0, 0);
    }

    public int getHora() {
        return hora;
    }

    public void setHora(int hora) {
        if(hora >= 0 && hora < 60) {
            this.hora = hora;

            if (minuto == 60) {
                this.hora++;            
            }
        }
    }
    
    public int getMinuto() {
        return minuto;
    }

    public void setMinuto(int minuto) {
        if(minuto >= 0 && minuto < 60) {
            this.minuto = minuto;

            if (segundo == 60) {
                this.minuto++;
                segundo = 0;           
            }
        }
    }

    public int getSegundo() {
        return segundo;
    }

    public void setSegundo(int segundo) {
        if(segundo >=0 && segundo < 60) {        
            this.segundo = segundo;
            /* Nao faco ideia porque estavas a aumentar os segundos 
                e a mudar o minuto */
        }
    }

    /* Faz mais sentido ter um metodo que inicie o relogio que fazer um 
        set aos seus segundos. Na pratica o resultado, e ate o codigo, sao os mesmos
        e' apenas uma correccao logica */
    public void iniciar() {
        segundos = 1;
    }

    public static void main(String[] args) {
        Crondados cron = new Crondados();
        cron.iniciar();

        System.out.println("Hora: " + cron.getHora() + ", Minuto: " + cron.getMinuto() + ", Segundo: " + cron.getSegundo());
    }
}

Repara que este exemplo é demasiado simplista e não representa correctamente um relógio, nem funcionará como tal se o tentares usar num programa com esse objectivo. É apenas um exemplo simples de como fazer uma classe.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado, knitter! :D

eu estava aumentando os segundos pra fazer com que chegasse a 1 minuto e assim repetisse novamente...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora