Esercizi in Java - Parte 2

Mettiamo alla prova la nostra conoscenza di java con altri tre esercizi.

Lista di Generics

Scrivi una classe che permetta di salvare al suo interno una coppia di generici.

Soluzione

public class Coppia<T,K> {

    private T chiave;
    private K valore;
    
    public Coppia(T chiave, K valore){

        this.chiave = chiave;
        this.valore = valore;
    }

    public T getChiave(){
        return chiave;
    }

    public void setChiave(T chiave){
        this.chiave = chiave;
    }

    public K getValore(){
        return valore;
    }

    public void setValore(K valore){
        this.valore = valore;
    }
}

Gestione di un'eccezione

La seguente classe classe genera una CustomException, il tuo compito è usarla e gestire l'eccezione. Puoi confrontare la tua soluzione con la mia che trovi qui sotto.

import java.text.SimpleDateFormat;
import java.util.Date;

public class CustomLogger {
    
    public CustomLogger() {

    }

    public void log(String message) throws CustomException {

        if(Math.random() < 0.5) {
            throw new CustomException("Logger error!");
        }
        else {
            
            String time = new SimpleDateFormat("HH:mm:ss.SSS").format(new Date());
            System.out.println("[" + time + "] " + message);
        }
    }
}
public class CustomException extends Exception {
    
    public CustomException(String message) {
        super(message);
    }
}
Soluzione

La classe CustomLogger fa il log dei messaggi sulla console, cioè li stampa con informazioni aggiuntive, in questo caso l'orario. Il Math.random() al suo interno fa si che circa il 50% delle volte che la funzione log viene eseguita si generi una CustomException. Il nostro compito quindi è quello di gestire questa eccezione ma di assicurarci anche che i messaggi vengano comunque stampati sullo schermo, nel catch metterò quindi una System.out.println() che stamperà comunque il messaggio.

class Main {

    private static CustomLogger logger;

    public static void main(String[] args) {

       logger = new CustomLogger();

       stampaLog("Linea 1");
       stampaLog("Linea 2");
       stampaLog("Linea 3");
       stampaLog("Linea 4");
       stampaLog("Linea 5");
       stampaLog("Linea 6");
       stampaLog("Linea 7");
       stampaLog("Linea 8");
       stampaLog("Linea 9");
       stampaLog("Linea 10");
    }

    private static void stampaLog(String messaggio) {
        try{
            logger.log(messaggio);
        }
        catch(CustomException e){
            System.out.println("CustomLogger ha lanciato un'eccezione, il messaggio era: " + messaggio);
        }
    }
}

Implementazione di una gerarchia di classi UML

Dato il seguente diagramma UML implementa le sue classi. Puoi sempre controllare come ho fatto io premendo su soluzione.

diagramma UML

Soluzione
public interface Velivolo {
    
    public void decolla();
    public void atterra();
}
public abstract class Aereo implements Velivolo{
    
    public String marca;
    public String modello;
    public int anno;

    public Aereo(String marca, String modello, int anno){

        this.marca = marca;
        this.modello = modello;
        this.anno = anno;
    }

    public String getMarca(){
        return marca;
    }

    public String getModello(){
        return modello;
    }

    public int getAnno(){
        return anno;
    }

    public abstract String emergenza();

    public abstract void decolla();
    public abstract void atterra();
}
public class AereoDiLinea extends Aereo {
    
    public int passeggeri;
    public String compagnia;

    public AereoDiLinea(String marca, String modello, int anno, int passeggeri, String compagnia){

        super(marca, modello, anno);

        this.passeggeri = passeggeri;
        this.compagnia = compagnia;
    }

    public String emergenza() {
        return "Indossare le mascherine per l'ossigneno.";
    }

    public void decolla() {
        System.out.println("Un aereo di linea ("+ modello + ") sta decollando!");
    }

    public void atterra() {
        System.out.println("Un aereo di linea ("+ modello + ") sta atterrando!");
    }

    public int getPasseggeri(){
        return passeggeri;
    }

    public String getCompagnia(){
        return compagnia;
    }
}
public class AereoMilitare extends Aereo {
        
    public double velocita;
    public double peso;

    public AereoMilitare(String marca, String modello, int anno, double velocita, double peso){

        super(marca, modello, anno);

        this.velocita = velocita;
        this.peso = peso;
    }

    public String emergenza() {
        return "Aprire la calotta e gettarsi con il paracadute!";
    }

    public void decolla() {
        System.out.println("Un aereo militare ("+ modello + ") sta decollando!");
    }

    public void atterra() {
        System.out.println("Un aereo militare ("+ modello + ") sta atterrando!");
    }

    public double getVelocita(){
        return velocita;
    }

    public double getPeso(){
        return peso;
    }
}
© Nicola Bovolato 2020