Esami di PO

Definizioni

Setter

Spiegare cosa si intende per metodo setter. Fornire almeno una motivazione per la quale l'uso di setter è preferibile alla definizione di campi pubblici. Fare un esempio concreto (con codice) di un setter che svolge una funzione non ottenibile con un campo pubblico.

Svolgimento

Un metodo setter serve a impostare il valore di una proprietà privata o protetta. Tramite un metodo setter è possibile eseguire altro codice, oltre all'assegnazione del valore, tra cui eventuali controlli di validità del valore stesso.

Esempio:

private int lucky;
public void setLucky(int value) {
    if(value == 13 || value == 17) lucky = 0; else lucky = value;
}

Sovrascrittura

Spiegare approfonditamente in concetto di sovrascrittura di un metodo e quali sono le condizioni nelle quali puo essere utile. Fare un esempio pratico mostrando le necessarie porzioni di codice.

Svolgimento

La sovrascrittura si usa quando una classe eredita da una superclasse, e desidera modificare il funzionamento di un metodo ereditato.

Consiste nel creare un metodo, nella subclasse, che ha lo stesso nome e gli stessi parametri dell'omonimo nella superclasse e permette di ridefinirne il comportamento.

Un esempio comune di sovrascrittura riguarda il metodo toString() presente nella classe object:

class Example {
    int value;
    String key;

    public String toString() {
        return key + " => " + value;
    }
}

Espressioni lambda

Considerare l'interfaccia ActionListener con l'unico metodo void actionPerformed(ActionEvent e). Considerare il JButton b e mostrare (con codice) come utilizzare il metodo void addActionListener(ActionListener l) per aggiungere un ActionListener che stampi a console la stringa "Java", codi cato rispettivamente come una classe anonima e come un'espressione Lambda.

Svolgimento
JButton jbutton = new JButton(); 
jbutton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Java");
    }
});
 
jbutton.addActionListener((e) -> {
    System.out.println("Java");
});

Design e programmazione

I seguenti esercizi servono a veri care la capacita dello studente di progettare e implementare soluzioni utilizzando il paradigma a oggetti e il linguaggio Java. Cio che sara valutato e la correttezza e completezza della soluzione sul piano progettuale e concettuale. Non sara dato peso ad errori sintattici. E possibile utilizzare libro e appunti.

Realizzare una classe MagicBox<T> che permetta di inserire al suo interno un oggetto di tipo T, di veri care se un determinato oggetto e nella scatola, di conoscere in numero di oggetti nella scatola e di rimuovere da essa uno speci co
oggetto.

Prevedere esplicitamente anche un metodo ArrayList<T> toArrayList() che restituisce un ArrayList contenente tutti gli elementi nella MagicBox (non importa l'ordine).
Considerare inoltre un'interfaccia funzionale Filter dotata di un unico metodo boolean accept(Object x), e aggiungere a MagicBox un metodo MagicBox<T> filterWith(Filter f) che restituisce una nuova MagicBox contenente solo
gli elementi per i quali f restituisce valore true tramite accept.

Mostrare un esempio di utilizzo che usi un'espressione Lambda.

public class MagicBox {

    private ArrayList elements;
    
    public static void main(String[] args) {
        MagicBox m = new MagicBox();
        m.addElement(4);
        m.addElement("ciao");
        m.addElement(new MagicBox());
        System.out.println(m.countOfElements());
        m.removeElement(4);
        System.out.println(m.countOfElements());
        System.out.println(m.isInMagicBox("ciao"));
        MagicBox m1 = m.FilterWith(new Filter() {
            @Override
            public boolean accept(Object x) {
                if(!(x instanceof String)) return false;
                if("ci".equals(x.toString().substring(0, 2))) return true;
                return false;
            }
        });
        System.out.println(m1.countOfElements());
    }
    
    public MagicBox() {
        elements = new ArrayList<>();
    }
    
    public boolean isInMagicBox(T element) {
        return elements.stream().anyMatch(x -> x.equals(element));
    }
    
    public int countOfElements() {
        return elements.size();
    }
    
    public void addElement(T element) {
        elements.add(element);
    }
    
    public void removeElement(T element) {
        if(isInMagicBox(element)) elements.remove(element);
    }

    public ArrayList<T> ToArrayList() {
        return (ArrayList<T>)elements.clone();
    }
    
    public MagicBox FilterWith(Filter f) {
        MagicBox filtered = new MagicBox();
        elements.stream().filter(x -> f.accept(x)).forEach(x -> filtered.addElement(x));
        return filtered;
    }
}