Perché Java non consente l'uso di intestazioni come in C ++

18

Ho una domanda per la quale non ho trovato risposta, ad eccezione della seguente risposta che non soddisfa i miei requisiti:

"Because James Gosling didn't want to"

So che Java può avere interfacce (solo funzioni virtuali pure, nessun attributo), ma non è esattamente la stessa cosa delle definizioni di classe.

    
posta CoachNono 10.11.2011 - 19:13
fonte

6 risposte

46

The following answer that does not meet my requirements: "Because James Gosling didn't want to."

Questa è la risposta giusta, però. Il team di progettazione linguistica (Gosling, Sheridan, Naughton, in seguito Bill Joy, Ken Arnold, ecc.) Ha deciso che le intestazioni causavano più problemi di quanti ne risolvessero . Così li hanno progettati e hanno dimostrato che potevano creare una lingua perfettamente utile senza il bisogno di farlo.

Da Sezione 2.2.1 del white paper sull'ambiente linguistico Java :

Source code written in Java is simple. There is no preprocessor, no #define and related capabilities, no typedef, and absent those features, no longer any need for header files. Instead of header files, Java language source files provide the definitions of other classes and their methods.

Definizioni ridondanti, mantenimento dei file sincronizzati, definizioni in conflitto, definizioni nascoste - nessuno di questi si verifica in Java, perché non hai intestazioni. Se vuoi vedere una definizione di classe nuda, puoi generarne direttamente una da un file .java - ad es. la maggior parte degli IDE mostrerà la struttura di una classe in una barra laterale, che equivale alla stessa cosa.

    
risposta data 10.11.2011 - 19:25
fonte
15

Non è necessario in C ++ avere le definizioni di classe e le dichiarazioni in file separati. Significa solo che è possibile, almeno nei giorni C, eseguire l'analisi in una singola scansione in alto a fondo del codice. Su macchine senza memoria ad accesso casuale questo è stato un grosso problema!

Avere intestazioni ti ha anche permesso di pubblicare l'interfaccia nella libreria di codici fornendo l'intestazione senza dover rivelare il codice sorgente. Sfortunatamente in C ++ devi anche rivelare i membri di dati privati che hanno portato a soluzioni come l'orrore di Pimpl .

Ci sono stati tentativi di creare un ambiente C ++ in cui tutto è stato memorizzato in una struttura di tipo di database e non ci sono file ma non è stato catturato.

    
risposta data 10.11.2011 - 19:17
fonte
14

A causa del principio DRY . In Java, le informazioni necessarie per utilizzare le classi in un pacchetto (o classe) sono contenute nel file .class. La creazione di file di intestazione separati contenenti le stesse informazioni comporterebbe la ripetizione in due punti.

    
risposta data 10.11.2011 - 19:27
fonte
6

In ogni lingua - ci sono due fasi per la creazione del codice binario finale - compilazione e collegamento (ovviamente, c'è il caricamento ma non ha molto impatto qui). Al momento della compilazione, è sufficiente inserire hook (la specifica delle funzioni che verranno chiamate) al posto appropriato. Il linker in realtà si unisce quando entrambi i codici reali sono disponibili. Finora non c'è differenza tra C ++ e Java.

è , tuttavia, è necessario che il C ++ abbia una dichiarazione e una definizione separate. Se si mantiene l'implementazione nell'intestazione e se il file di intestazione cambia, il codice che è collegato deve essere ricompilato. Dove come se la definizione fosse in un file separato, il codice ha solo bisogno di essere ricollegato.

Comprendi che C ++ ha l'opzione per avere il collegamento statico che implica che il codice oggetto è stato risolto insieme all'applicazione chiamante. Si prega di notare che sia in C che in C ++, non è invalido avere una programmazione nel file di intestazione o persino fare #include. significa solo che devi preoccuparti di come avviene il collegamento con questi file oggetto.

La situazione in Java è molto diversa. Ogni file di classe è compilato con un file .class. Infatti, la necessità della compilazione di funzioni di classe chiamante che è servita come una sezione di intestazione nel file .class. Tuttavia, in Java il collegamento finale viene eseguito solo all'interno del Runtime (la macchina virtuale) solo con le specifiche del codice byte del file di classe.

Vedi questo e this

    
risposta data 10.11.2011 - 20:39
fonte
4

Effettivamente le interfacce e include sono le intestazioni; le definizioni sono quindi identici ai binari e non possono essere sfasati. Questo è una delle migliori decisioni di design in Java, ma è un fastidio minore che non c'è modo di raggruppare queste dichiarazioni per compattezza e coerenza.

    
risposta data 10.11.2011 - 19:33
fonte
1

Una buona ragione per avere include è separare il codice che potresti voler riutilizzare (come le definizioni comuni) dal codice specifico per un dato progetto. Java vuole che tu specifichi solo una classe o un'interfaccia per file e che per lo più riduca la necessità di intestazioni incluse, perché le parti condivise saranno già contenute nei loro file.

Inoltre, i compilatori e i sistemi di compilazione potrebbero voler memorizzare nella cache le intestazioni precompilate per evitare di analizzarle più di una volta.

    
risposta data 16.02.2012 - 15:43
fonte

Leggi altre domande sui tag