Quando creo gerarchie di tipi complessi (diversi livelli, diversi tipi per livello), mi piace utilizzare la parola chiave final
sui metodi che implementano una dichiarazione di interfaccia. Un esempio:Parola chiave del metodo Java "final" e il suo utilizzo
interface Garble {
int zork();
}
interface Gnarf extends Garble {
/**
* This is the same as calling {@link #zblah(0)}
*/
int zblah();
int zblah(int defaultZblah);
}
E poi
abstract class AbstractGarble implements Garble {
@Override
public final int zork() { ... }
}
abstract class AbstractGnarf extends AbstractGarble implements Gnarf {
// Here I absolutely want to fix the default behaviour of zblah
// No Gnarf shouldn't be allowed to set 1 as the default, for instance
@Override
public final int zblah() {
return zblah(0);
}
// This method is not implemented here, but in a subclass
@Override
public abstract int zblah(int defaultZblah);
}
faccio questo per diversi motivi:
- E mi aiuta a sviluppare la gerarchia tipo. Quando aggiungo una classe alla gerarchia, è molto chiaro, quali metodi devo implementare e quali metodi non posso sovrascrivere (nel caso in cui ho dimenticato i dettagli della gerarchia)
- Penso che l'override di concreto sia il cattivo secondo i principi e i modelli di progettazione, come il modello
template method
. Non voglio che altri sviluppatori o i miei utenti lo facciano.
Quindi la parola chiave final
funziona perfettamente per me. La mia domanda è:
Perché viene usato così raramente in natura? Puoi mostrarmi alcuni esempi/motivi in cui final
(in un caso simile al mio) sarebbe molto cattivo?
+1 per il suggerimento. Questo è esattamente il caso d'uso che avevo in mente. Non l'ho quasi mai visto ... –
** Risposta accettata ** perché entrambi hanno risposto alla mia domanda ** E ** mi ha dimostrato che avevo torto sul fatto che 'finale' non è spesso usato sui metodi ** E ** provato ho ragione sul mio utilizzo :) Grazie, Chris –