Nel Null Object Pattern, un oggetto NULL sostituisce il controllo dell’istanza di tale oggetto. Sostanzialmente, non bisognerà più controllare se l’istanza dell’ Oggetto è NULL. Tale oggetto Null può anche essere utilizzato per fornire un comportamento predefinito nel caso in cui i dati non siano disponibili.

Null object

Per implementare il pattern, creiamo una classe astratta specificando le varie operazioni da eseguire, dopo di chè creiamo le classi concrete che la estendono ed una classe di oggetti null che non fornisce alcuna implementazione, ma verrà utilizzata esattamente come check di istanza null.

DIAGRAMMA UML

uml

IMPLEMENTAZIONE NULL OBJECT

Step 1: Creiamo la classe astratta

public abstract class Cliente {
    protected String nome;
    public abstract boolean isNull();
    public abstract String getNome();
}

Step 2: Creiamo le classi concrete

ClienteReale.java

public class ClienteReale extends Cliente {

    public ClienteReale(String nome) {
        this.nome = nome;
    }

    @Override
    public String getNome() {
        System.out.println("[CLIENTEREALE]: getNome()::start");
        System.out.println("[CLIENTEREALE]: getNome()::end");
        return "[CLIENTEREALE]: "+nome;
    }

    @Override
    public boolean isNull() {
        return false;
    }
}

ClienteNullo.java

public class ClienteNullo extends Cliente {

    @Override
    public String getNome() {
        System.out.println("[CLIENTENULLO]: getNome()::start");
        System.out.println("[CLIENTENULLO]: getNome()::end");
        return "[CLIENTENULLO]: Cliente non trovato!";
    }

    @Override
    public boolean isNull() {
        return true;
    }
}

Step 3: Creiamo la factory

public class ClienteFactory {

    public static final String[] nomi = {"Roberto", "Giovanni", "Giulia"};

    public static Cliente getNome(String name){
        for (int i = 0; i < nomi.length; i++) {
            if (nomi[i].equalsIgnoreCase(name)){
                return new ClienteReale(name);
            }
        }
        return new ClienteNullo();
    }
}

Step 4: Creiamo il main

public class Main {
    public static void main(String[] args) {

        Cliente cliente1 = ClienteFactory.getNome("Roberto");
        Cliente cliente2 = ClienteFactory.getNome("Giovanni");
        Cliente cliente3 = ClienteFactory.getNome("Giulia");
        Cliente cliente4 = ClienteFactory.getNome("Antonio");

        System.out.println("[MAIN]: Lista clienti");
        System.out.println(cliente1.getNome());
        System.out.println(cliente2.getNome());
        System.out.println(cliente3.getNome());
        System.out.println(cliente4.getNome());
    }
}

Step 5: Output

[MAIN]: Lista clienti
[CLIENTEREALE]: getNome()::start
[CLIENTEREALE]: getNome()::end
[CLIENTEREALE]: Roberto
[CLIENTEREALE]: getNome()::start
[CLIENTEREALE]: getNome()::end
[CLIENTEREALE]: Giovanni
[CLIENTEREALE]: getNome()::start
[CLIENTEREALE]: getNome()::end
[CLIENTEREALE]: Giulia
[CLIENTENULLO]: getNome()::start
[CLIENTENULLO]: getNome()::end
[CLIENTENULLO]: Cliente non trovato!

 

LINK UTILI