Visualizzazione dei risultati da 1 a 5 su 5

Discussione: asserzioni

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315

    asserzioni

    Sto studiando le asserzioni ma ho un dubbio su questo frammento di codice:

    codice:
    public class PortaMonete
    { 
        private static final int DIMENSIONE = 10;
        
        private final Moneta monete [] = new Moneta [DIMENSIONE];
        
        
        public PortaMonete(int... valori)
        {
            assert monete.length==DIMENSIONE;  
    
            try
            {
                int numeroMonete = valori.length;
                for(int i=0; i<numeroMonete; i++)
                {
                    if (i>=10)
                    {
                        throw new PortaMonetePienoException();
                    }
                    monete[i] = new Moneta(valori[i]);
                }
            }
            catch(PortaMonetePienoException exc)
            {
                System.out.println("problema: " + exc.getMessage() + "\n");
            }
            catch(NullPointerException exc)
            {
                System.out.println("Portamonete creato vuoto");
            }
            System.out.println("\n");
            
            assert monete.length==DIMENSIONE; 
        }
    
    ...
    
    }
    In questo caso sono state utilizzate una pre-condizione e una post-condizione che permettono di verificare se la lunghezza dell'array rimane quella iniziale.
    Io allora mi chiedo, che senso ha utilizzare queste due asserzioni dal momento in cui sia l'array che DIMENSIONE sono dichiarati final (quindi non potrò avere un metodo set)?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Io allora mi chiedo, che senso ha utilizzare queste due asserzioni dal momento in cui sia l'array che DIMENSIONE sono dichiarati final (quindi non potrò avere un metodo set)?
    Nessuna delle due assert ha tantissimo senso. Al massimo sarebbe sensata una sola, quella all'inizio. E a patto di usare DIMENSIONE anche nel test per il porta-monete "pieno" (quello che adesso è if (i>=10) )

    Limitare il numero di elementi Moneta va bene, può essere una necessità lecita. Ma si poteva istanziare l'array Moneta[] in base al numero effettivo di valori, cosa che evitava ulteriori controlli di "sforamento".

    Nemmeno i due catch hanno tantissimo senso lì. NullPointerException può uscire ragionevolmente solo se 'valori' (il parametro) è null, cosa tecnicamente possibile. Ma sarebbe o da testare come precondizione (lanciando fuori NullPointerException) oppure accettare che NullPointerException sbuchi in automatico (idem uscendo fuori dal costruttore) al primo uso di valori.
    PortaMonetePienoException o lo si fa uscire fuori dal costruttore (che ha senso) oppure è meglio cambiare la logica.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Io sinceramente non capisco proprio che senso possa avere inserire anche solo la prima di quelle due assert dal momento in cui verrà effettuato un controllo (quello sull'assert) che di sicuro restituirà true. Magari lo scopo dell'esercizio era puramente didattico anche perchè è scontato che debba essere true. O sbaglio?

  4. #4
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    l'esempio e` effettivamente molto banale e anche il resto del codice, come detto da andbin, non e` il massimo. Tuttavia centra pienamente l'obiettivo principale delle asserzioni: verificare condizioni che non si devono MAI verificare.

    La differenza principale fra asserzione ed eccezione, oltre al fatto che un asserzione fallita ammazza il processo, e` che si suppone che sia sempre vera.

    Sono dei controlli extra che metti in fase di sviluppo per ragioni di debug.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    ah ecco, quindi è normale che siano controlli per così dire scontati.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.