Oggi sono rimasto scioccato nello scoprire che questo codice viene compilato in modo pulito in Java:
public class A {
public static class B {
private static void x() {}
}
private static class C {
private /* So, private to what exactly? */ static void x() {}
}
public static void main(String[] args) {
B.x(); C.x();
}
}
Sembra che la parola chiave privata di Java indichi solo la privacy di livello superiore; che, data la convenzione generale per denominare i file di origine Java per classe, significa che Java fornisce effettivamente solo visibilità privata a livello di file, non vera visibilità privata. (Il codice equivalente in C ++ non viene compilato con un errore di visibilità.)
Qualcuno sarebbe in grado di spiegare perché Java è stato progettato in questo modo? O è solo il modo di Java di dire a tutti di non usare classi annidate? (Si tratta certamente di un'implementazione di una relazione di amici C ++ a due vie, ma abbiamo già una visibilità a livello di pacchetto per questo, questo sembra rendere impossibile l'equivalente a senso unico.Inoltre, è necessario che il compilatore crei più metodi di accesso nascosti per eludere la visibilità e il downgrade del controllo della visibilità della classe nidificato per evitare che tutto ciò non si verifichi in fase di esecuzione. In realtà, perché il problema?)