Facciamo un esempio:Perché Java 8 non consente metodi predefiniti non pubblici?
public interface Testerface {
default public String example() {
return "Hello";
}
}
public class Tester implements Testerface {
@Override
public String example() {
return Testerface.super.example() + " world!";
}
}
public class Internet {
public static void main(String[] args) {
System.out.println(new Tester().example());
}
}
abbastanza semplicemente, questo sarebbe stampare Hello world!
. Ma dire che stavo facendo qualcos'altro con il valore di ritorno di Testerface#example
, ad esempio inizializzando un file di dati e restituendo un valore interno sensibile che non dovrebbe lasciare la classe di implementazione. Perché Java non consente i modificatori di accesso sui metodi di interfaccia predefiniti? Perché non possono essere protetti/privati e potenzialmente elevati da una sottoclasse (simile a come una classe che estende una classe genitore può utilizzare un modificatore più visibile per un metodo sottoposto a override)?
Una soluzione comune si sta spostando su una classe astratta tuttavia nel mio caso specifico, ho un'interfaccia per enumerazione, quindi non si applica qui. Immagino sia stato trascurato o perché l'idea originale dietro le interfacce fosse un "contratto" di metodi disponibili, ma suppongo di voler dare un input su cosa sta succedendo con questo.
ho letto "Why is “final” not allowed in Java 8 interface methods?", in cui si afferma:
L'idea di base di un metodo di default è: si tratta di un metodo di interfaccia con un'implementazione di default, e una classe derivata può fornire una più specifica implementazione
E mi sembra che la visibilità non romperebbe affatto questo aspetto.
Come per la domanda collegata poiché sembra abbia avuto problemi a essere chiusa, una risposta autorevole sarebbe apprezzata in questa materia, piuttosto che in base all'opinione pubblica.
quale sarebbe il significato di un metodo privato in un'interfaccia? – njzk2
@ njzk2 per la domanda "Diciamo che stavo facendo qualcos'altro con il valore di ritorno di Testerface # esempio, per esempio inizializzando un file di dati e restituendo un valore interno sensibile che non dovrebbe lasciare la classe di implementazione". Questa è un'interfaccia per un enum, quindi anche se è un po 'complesso, non direi che ci sono molti modi migliori per quello che sto facendo al di fuori di questa domanda. – Rogue
un metodo privato può essere chiamato solo dalla propria classe. Nel caso di un'interfaccia, significherebbe un metodo che non può essere chiamato. – njzk2