Salve ho il seguente esercizio diviso in parti:
Testo
codice:
B) Fare in modo che ogni oggetto di questa classe contenga sempre dei dati validi
    1) si offre un costruttore che richiede ora, minuti e secondi (in caso di uno o più valori non validi l’orario viene inizializzato a 0:00:00).
    2) si offre un altro costruttore che richiede solo ora e minuti e imposta i secondi a zero (in caso di uno o più valori non validi l’orario viene inizializzato a 0:00:00).
    3) si offre un altro costruttore che non richiede alcun parametro e imposta ore, minuti e secondi a zero
    4) qualsiasi modifica richiesta con qualsiasi altro metodo viene annullata se porta ad un orario non valido (ovvero viene ripristinato l’ultimo orario valido)
codice:
public class MyOrario {
    private int ore;
    private int minuti;
    private int secondi;
    private boolean formatoSecondi;

    //Costruttore che richiede ora, minuti e secondi
    public MyOrario(int ore, int minuti, int secondi) {
        this.ore = ore;
        this.minuti = minuti;
        this.secondi = secondi;
        if (orarioNonValido()) {
            setDefault();
        }
        setFormatoSecondiSi();
    }

    //Costruttore che richiede solo ora e minuti e imposta i secondi a zero
    public MyOrario(int ore, int minuti) {
        this.ore = ore;
        this.minuti = minuti;
        secondi = 0;
        if (orarioNonValido()) {
            setDefault();
        }
        setFormatoSecondiSi();
    }

    //Costruttore che non richiede alcun parametro e imposta ore, minuti e secondi a zero
    public MyOrario() {
        setDefault();
        setFormatoSecondiSi();
    }

    //Metodi Getter e Setter
    public int getOre() {
        return ore;
    }

    public void setOre(int ore) {
        this.ore = ore;
        if (orarioNonValido()) {
            setDefault();
        }
    }

    public int getMinuti() {
        return minuti;
    }

    public void setMinuti(int minuti) {
        this.minuti = minuti;
        if (orarioNonValido()) {
            setDefault();
        }
    }

    public int getSecondi() {
        return secondi;
    }

    public void setSecondi(int secondi) {
        this.secondi = secondi;
        if (orarioNonValido()) {
            setDefault();
        }
    }

    //Metodo verifica correttezza orario inserito
    protected boolean orarioNonValido() {
        boolean nonValido = false;
        if ((ore < 1 || ore > 24) || (minuti < 0 || minuti > 59) || (secondi < 0 || secondi > 59)) {
            nonValido = true;
        }
        return nonValido;
    }

    //Metodo setter orario a 0 in caso di errore
    protected void setDefault() {
        ore = minuti = secondi = 0;
    }
1- I costruttori sono concettualmente corretti? Cioè si possono fare in quel modo?
2 - Inoltre è lecito fare il metodo setDefault che setta a a 0 (ore, secondi, minuti) ? invece di usare ogni volta ore=minuti=secondi=0???

Testo
codice:
C) Consentire all’utente due tipi di stampe:
    1) con i secondi (15:05:38)
    2) senza secondi (15:05)
Il valore di default è il primo (con i secondi). Si offrono all’utente tre metodi per gestire la presenza dei secondi nella stampa di un oggetto di tipo MyOrario:
    3) setFormatoSecondiSi che imposta il formato di cui al punto 1
    4) setFormatoSecondiNo che imposta il formato di cui al punto 2
    5) getFormatoSecondi  che restituisce vero se ci troviamo nella condizione di cui al punto 1 e falso in caso contrario.
codice:
    //Metodi setter e getter per variabile boolean formatoSecondi
    public boolean setFormatoSecondiSi() {
        return formatoSecondi = true;
    }

    public boolean setFormatoSecondiNo() {
        return formatoSecondi = false;
    }

    public boolean getFormatoSecondi() {
        return formatoSecondi;
    }

    //Metodo toString
    public String toString() {
        String stringaOrario ="";
        if(formatoSecondi) {
            if(minuti < 10 && secondi < 10) {
                stringaOrario = ore + ":0" + minuti + ":0" + secondi;
            }else if(minuti < 10) {
                stringaOrario = ore + ":0" + minuti + ":" + secondi;
            } else if(secondi < 10){
                stringaOrario = ore + ":" + minuti + ":0" + secondi;
            } else {
                stringaOrario = ore + ":" + minuti + ":" + secondi;
            }
        }else {
            if(minuti < 10) {
                stringaOrario = ore + ":0" + minuti;
            }else {
                stringaOrario = ore + ":" + minuti;
            }
        }
        return stringaOrario;
    }
3- Si può fare in un altro modo (più efficente, o corretto) il metodo toString, magari utilizzando meglio gli if?

Testo
codice:
E) Offrire all’utente dei metodi per confrontare degli orari
    1) un metodo per confrontare l’oggetto in questione con un altro oggetto di tipo MyOrario passato al metodo come argomento (che restituirà 0 se i due orari coincidono, 1 se il nostro orario è maggiore di quello passato, -1 se il nostro orario è inferiore a quello passato)
    2) un metodo statico per confrontare due oggetti di tipo MyOrario passati al metodo come argomenti (che restituirà 0 se i due orari coincidono, 1 se il primo orario è maggiore del secondo, -1 se il primo orario è inferiore al secondo)
codice:
 //Metodo per confrontare l’oggetto in questione con un altro oggetto di tipo MyOrario
    //restituirà 0 se i due orari coincidono, 1 se il nostro orario è maggiore di quello passato, -1 se il
    //nostro orario è inferiore a quello passato
    public int confronto (MyOrario orarioDaConfrontare) {
        int risConfronto;
        if( (this.getOre() == orarioDaConfrontare.getOre() && this.getMinuti() == orarioDaConfrontare.getMinuti() && this.getSecondi() > orarioDaConfrontare.getSecondi())
                || (this.getOre() == orarioDaConfrontare.getOre() && this.getMinuti() > orarioDaConfrontare.getMinuti())
                || ( this.getOre() > orarioDaConfrontare.getOre()) ) {
             risConfronto = 1;
        }else if ( this.getOre() == orarioDaConfrontare.getOre() && this.getMinuti() == orarioDaConfrontare.getMinuti() && this.getSecondi() == orarioDaConfrontare.getSecondi() ){
            risConfronto = 0;
        }else {
            risConfronto = -1;
        }
        return risConfronto;
    }

    //Metodo statico per confrontare due oggetti di tipo MyOrario passati al metodo come argomenti
    static int confronto (MyOrario orario, MyOrario orarioDaConfrontare){
      return  orario.confronto(orarioDaConfrontare);
    }
4- Qui il problema sta nella leggibilità del codice, in seguito alle condizioni, come posso migliorarlo o renderlo più leggibile??

Grazie mille fin da ora