Domanda sulla decisione di progettazione delle classi nidificate Java

4

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?)

    
posta user508633 04.07.2013 - 04:04
fonte

1 risposta

3

Benvenuto in Java.

Il tuo codice è nel file per la classe A. La parola "privato" in questo file significa privato in classe A. La classe B è solo una parte della classe A. Tuttavia, il "privato" per il metodo x serve uno scopo importante; significa che nessun codice esterno della classe A può chiamare quel metodo su un'istanza di classe B. Ciò significa che mentre un'istanza di classe B potrebbe essere disponibile in tutto il programma, qualsiasi problema causato dal metodo x deve essere causato da qualche parte nella classe A. In un sistema grande e complesso questo incapsulamento rende la vita molto più semplice, sia per il debugging che per la modifica del codice.

L'idea qui è che un oggetto di classe A può comunicare con il resto del sistema con istanze di classi come B e C mantenendo un grande controllo su quelle istanze - poiché il metodo x può solo essere chiamato da dentro A. (E se le classi non fossero static , A avrebbe ancora più modi per controllare B e C.)

In Java e C #, le classi annidate sono cose completamente differenti con scopi completamente diversi; non confonderli In C #, sono solo classi normali con un ambito leggermente limitato. In Java, le classi nidificate sono molto gli agenti, o le estensioni, o i rappresentanti, del loro antenato di primo livello. L'approccio Java non ha molto senso fino a quando non ci lavori su un sistema complesso, ma se lo fai diventerà molto avvincente.

    
risposta data 05.07.2013 - 23:08
fonte

Leggi altre domande sui tag