Una delle domande che ti possono capitare ad un colloquio o ad una certificazione o un semplice test riguardo il linguaggio Java è la seguente: Come puoi limitare l’ereditarietà per una classe? Le risposte comunemente accettate per questa domanda sono
- Commentando con
//
o/* */
- Rendendo tutti i costruttori
private
- Rendendo la classe
final
- Rendendo tutti i metodi
final
Numero 1:Commentando con //
o /* */
La numero 1. pochi la danno. Eppure probabilmente anche tu usi questa soluzione spesso. Solo che non sembra una risposta da fornire ad un colloquio. Sbagliato. Se ti rende più tranquillo puoi darla come ultima risposta, per me è un bonus. Pensaci, spoiler: trovi di più alla fine del post.
Numero 2:Rendendo tutti i costruttori private
La numero 2. riguarda il fatto che se tutti i costruttori sono private
il gioco dell’ereditarietà non funziona, provate a compilare queste due classi
public class AClass {
private AClass(){
}
}
public class BClass extends AClass {
}
e otterrai questo errore di compilazione
AClass() has private access in AClass
public class BClass extends AClass {
Numero 3:Rendendo la classe final
La numero 3. è usando la parola chiave final
, prova a compilare le due classi viste sopra così modificate
public final class AClass {
public AClass(){
}
}
public class BClass extends AClass {
}
otterrai
error: cannot inherit from final AClass
Numero 4:Rendendo tutti i metodi final
La quarta ed ultima è rendendo tutti i metodi final
, osserva la seguente ridefinizione delle classi viste sopra e prova ad effettuare una compilazione.
public class AClass {
public AClass() {
}
public final void method() {
}
}
public class BClass extends AClass {
public BClass() {
super();
}
@Override
public void method() {
}
}
Otterrai l’errore
method() in BClass cannot override method() in AClass
public void method() {
overridden method is final
Fai attenzione, la domanda è “Come posso limitare” non “Come posso impedire (del tutto)” l’ereditarietà. La soluzione con il modificare final
davanti a class
blocca completamente ogni possibilità di ereditare dalla classe.
Addendum Numero 1 Ecco due interpretazione
public class BClass /*extends AClass*/ {
public BClass() {
super();
}
//@Override
public void method() {
}
}
e
public abstract class AClass {
public AClass() {
}
/*public final void method() {
}*/
}
Un pochino borderline lo ammetto, ma scommettiamo che è la più usata?
E anche per oggi è tutto. Come al solito se hai una domanda in merito a questo post, vuoi un approfondimento o hai un argomento che ti interesserebbe che io trattassi nei prossimi post puoi scrivermi.