Modifica del codice ripetitivo per migliorare il buon design della programmazione

0

In Java Swing se vuoi aggiungere un listener a un componente, sarà simile a questo ...

JButton j = new JButton();
int counter = 0;
j.addAncestorListener(new AncestorListener() {
    @Override
    public void ancestorMoved(AncestorEvent event) {

    }
    @Override
    public void ancestorAdded(AncestorEvent event) {
        counter++;
    }
    @Override
    public void ancestorRemoved(AncestorEvent event) {

    }
});

Se potessi creare una nuova parola chiave Java e dirlo ...

JButton j = new JButton();
int counter = 0;
swinglistener (j, AncestorListener) {
    ancestorAdded {
        counter++;
    }
}

.... per ottenere lo stesso effetto. Questo codice sarebbe più leggibile? Sarebbe meglio? Quali altri aspetti del design del software "buono" otterrebbero questo cambiamento?

    
posta Ogen 30.03.2015 - 03:57
fonte

1 risposta

1

Supponendo di avere il controllo dell'interfaccia, in pratica stai descrivendo i metodi predefiniti di Java 8. È possibile definire un'implementazione dei metodi di interfaccia che verranno utilizzati se la classe di implementazione non la sovrascrive esplicitamente.

public interface MyAncestorListener {
    default void ancestorAdded(AncestorEvent event) {
    }

    default void ancestorMoved(AncestorEvent event) {
    }

    default void ancestorRemoved(AncestorEvent event) {
    }
}

class MyAncestorListenerImpl implements MyAncestorListener {
    @Override
    public void ancestorMoved(AncestorEvent event) {
        // Custom implementation here
    }
}

Se non hai la possibilità di modificare l'interfaccia (come nell'esempio Swing), puoi usare una classe base astratta per fornire implementazioni vuote per i metodi di interfaccia.

public abstract class AbstractAncestorListener implements AncestorListener {
    @Override
    public void ancestorAdded(AncestorEvent event) {
    }

    @Override
    public void ancestorMoved(AncestorEvent event) {
    }

    @Override
    public void ancestorRemoved(AncestorEvent event) {
    }
}

Puoi quindi sostituire solo i metodi che devi implementare.

JButton j = new JButton();
int counter = 0;
j.addAncestorListener(new AbstractAncestorListener() {
    @Override
    public void ancestorAdded(AncestorEvent event) {
        counter++;
    }
});
    
risposta data 30.03.2015 - 14:58
fonte

Leggi altre domande sui tag