Perché un file sorgente Java porta il nome della classe pubblica che contiene?


14

Sono un principiante che impara Java. In Java ogni file sorgente deve contenere una classe pubblica e quel file sorgente deve avere lo stesso nome di quella classe pubblica. Inoltre, nessun file sorgente può contenere due classi pubbliche. Perché questa restrizione?


4
Senza i dettagli, questo è un artefatto di progettazione storica del modo in cui Java è stato progettato. I linguaggi progettati più di recente, come C #, mentre sono simili a Java, non hanno questa limitazione.
gahooa,

13
Non è per applicare le migliori pratiche? Ho pensato che fosse l'unica ragione. In C # non hai questa limitazione a livello tecnico, ma StyleCop si lamenterà se il nome del file e il nome della classe non corrispondono o se hai più classi nello stesso file. Visual Studio sta inoltre incoraggiando pesantemente la relazione file-classe (pensa ai diagrammi di classe che creano file per te, o quando rinomini il file .cs, Visual Studio ti chiede se vuoi riformattare anche il nome della classe).
Arseni Mourzenko,

In un linguaggio compilato vecchio stile, il linker trova tutti i riferimenti e i simboli esterni. Ma Java non è collegato: se lo desideri, puoi caricare barattoli in fase di esecuzione. Senza un passaggio di collegamento, provare a mappare i nomi delle classi alle posizioni nel percorso di classe è molto più veloce se si conosce il nome del file da cercare.
Paul Tomblin,

4
@gahooa non è un artefatto di design, è una decisione deliberata di design. Questo rende molte cose molto più facili.

1
Che ne dici di usare grep ?
utente

Risposte:


19

In una delle sue newsletter degli specialisti Java, Heinz Kabutz analizza le specifiche della lingua di Oak . Lui scrive:

Perché ogni classe pubblica è in un file separato? (Sezione 1)

Questa è una domanda che mi è stata frequentemente posta durante i miei corsi. Fino ad ora non ho avuto una buona risposta a questa domanda. Nella sezione 1 leggiamo: "Sebbene ogni unità di compilazione di Oak possa contenere più classi o interfacce, al massimo una classe o un'interfaccia per unità di compilazione può essere pubblica".

Nella barra laterale spiega perché: "Questa limitazione non è ancora applicata dal compilatore, sebbene sia necessaria per un'importazione efficiente dei pacchetti"

È abbastanza ovvio - come la maggior parte delle cose una volta che conosci i motivi di progettazione - il compilatore dovrebbe fare un passaggio aggiuntivo attraverso tutte le unità di compilazione (file .java) per capire quali classi erano dove, e ciò renderebbe la compilazione ancora più lenta .

http://www.javaspecialists.eu/archive/Issue055.html


1
Per rendere la compilazione leggermente più veloce? Veramente? Non perché rende il tuo codice molto più organizzato? Dubito fortemente che questa sia la risposta corretta.
BlueRaja - Danny Pflughoeft,

1
@ BlueRaja-DannyPflughoeft Nel 1998, sono sicuro che ha fatto una differenza molto più grande
TheLQ

8

Ragioni a cui posso pensare

  • Rende all'inizio la ricerca di altre classi leggermente più semplice per il compilatore poiché non deve cercare in una classe pubblica casuale tutte le migliaia di file di classe, ma può semplicemente andare al file.
    • Questo probabilmente non ha più importanza, ma è appena iniziata la prima convention che non è mai cambiata
  • Nella compilazione una modifica a un file ha effetto solo su quel file. Se ci sono più classi, allora tutto deve essere ricompilato
  • Best practice: avere più classi pubbliche nello stesso file rende le cose confuse. Lo scopo dei file è di organizzare il codice sorgente, lo scopo delle cartelle è di organizzare i file. Se tutte le classi di un determinato pacchetto si trovano in un singolo super file da 100 MB, hai perso tutti i vantaggi e non hai ottenuto nessuno dei vantaggi dei file (oltre ad aggiungere un sacco di mal di testa durante la modifica)

1
Classi e interfacce non rappresentano necessariamente il livello più naturale di suddivisioni per il codice sorgente. Avere molte migliaia di righe di codice raggruppate in un unico file è scomodo, ma non lo è nemmeno avere 100 righe di contenuto "reale" (esclusi commenti o direttive di compilazione duplicate) distribuite tra una dozzina di file di origine. Mi chiedo come avrebbe funzionato, se un file di nome per il tipo doveva contenere la definizione oppure identificare il file che fa?
supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.