2012-01-16 16 views
11

Sono un programmatore C++ che sta attualmente imparando Java e mi chiedo se OOP in Java segua lo stesso principio di separazione della definizione e dichiarazione della classe come fa C++, es. posizionali entrambi in file separati. Ho dato un'occhiata a Internet, compreso il sito web degli sviluppatori Android, e tutto il codice che ho trovato ha la definizione e la dichiarazione eseguite allo stesso tempo.File separati per definizione e dichiarazione di classe in Java

Questa è semplicemente una delle differenze tra lo sviluppo in C++ e lo sviluppo in Java, oppure le fonti che ho visto stanno semplicemente facendo le cose in questo modo per limitare la complessità del loro codice per la pubblicazione su Internet? Ho visto dichiarazioni e definizioni combinate in alcuni documenti C++, anche se so che è una cattiva pratica farlo.

+0

Bene, avete interfacce e la loro separazione di implementazione in Java. – anubhava

+2

Cosa c'è con tutti e le interfacce? Questo non è assolutamente quello per cui sono. Separare una singola classe in interfaccia e implementazione non ha senso: esistono per consentire una forma leggera di ereditarietà multipla, per descrivere un comportamento generale che può essere implementato separatamente. Questo è diverso dalla separazione di C++ della definizione di una classe specifica. – Viruzzo

+0

Separare una singola classe in un'interfaccia e l'implementazione ha perfettamente senso quando la classe è "pesante" e si desidera un modo semplice per, ad esempio, creare una simulazione per il codice di test. Certo, farlo per classi molto semplici potrebbe essere eccessivo. – Seramme

risposta

6

Esiste un motivo pratico per separare la dichiarazione in C++ e consentire ai file di origine di essere compilati separatamente. Non c'è una tale necessità in Java (dato che tutto è compilato in bytecode separatamente), quindi non è permesso.

+2

Un'altra ragione per la separazione in C++, come ricordo, è che puoi dare a qualcuno l'interfaccia pubblica della tua classe senza dare loro il codice. In Java, questi metadati sono nel file '.class', quindi non hai bisogno di un'intestazione separata. – yshavit

+0

true @ishavit, naturalmente; tutto si riduce alla possibilità di compilare senza dover includere la fonte delle altre classi (rispettivamente per la perfomance e per motivi di sicurezza). – Viruzzo

4

La risposta riportata di seguito è stata modificata in base ai commenti.

Non è necessario dividere la classe in definizione e dichiarazione esclusivamente per il compilatore, in quanto non è necessario inoltrare dichiarazioni in Java (come in C++). Si consiglia di dividere una definizione di classe e dichiarazione in un paio di interfaccia/classe (o [abstract] Classe coppia di classe /) a causa di requisiti di progettazione, come ad esempio:

  • classi multiple di attuazione una singola interfaccia.
  • Remote Procedure Calls, in cui non si vuole esporre le tue dipendenze di classe (in quanto potrebbero non essere disponibili sul lato client)
  • classe che viene utilizzato da altre classi, ma non è necessario/vuole la sua piena funzionalità durante il test (es. servizio di accesso al database, che si consiglia di prendere in giro nel codice di test)

Tuttavia, questo è più simile a utilizzando una classe base virtuale e concreto attuare le classi in C++ ed è spesso chiamato "programmazione su un'interfaccia". Puoi leggere di più sulla tecnica in this article (con alcuni argomenti lì perché potresti preferire usare una classe astratta invece di un'interfaccia come base). Inoltre, tale scissione dovrebbe essere considerata attentamente; in molti casi, la suddivisione di una classe è un puro eccesso e porterà a un inutile aumento di codice.

Pertanto, la risposta breve è: non è necessario dividere la classe solo per il fatto di avere una dichiarazione di inoltro (che la domanda originale richiede), anche se si potrebbe volerlo fare se c'è un motivo di progettazione per (ma questo è non l'equivalente della suddivisione di file di intestazione/classe di C++).

+0

+1: utilizzare le interfacce per separare il contratto dall'implementazione. –

+0

-1: giustificato se sono necessarie più implementazioni di MyService; altrimenti è un'astrazione prematura (che è la radice di molto male) –

+1

(per la modifica) ma che comporta un comportamento comparabile alle pure classi astratte del C++, non ancora direttamente correlate alla separazione delle dichiarazioni. Comprendi che la principale fonte di controversia qui è la parte "per raggiungere una simile funzionalità": queste funzionalità non sono direttamente correlate! – Viruzzo

0

In Java si ha una classe in un file, cioè non è possibile - e non è necessario - suddividere le classi su più file (è possibile avere più classi non pubbliche in un solo file).

Quello che puoi fare è utilizzare le interfacce, ovvero definire l'interfaccia per una classe in un file e implementare quell'interfaccia in una classe in un altro file. Se si distribuisce l'API, si distribuisce l'interfaccia.

0

Non ci sono file di intestazione e di origine in Java come in C++. Se si desidera separare la dichiarazione della classe dall'implementazione, è possibile definire un'interfaccia che dichiari i metodi e quindi creare una classe che implementa l'interfaccia.

+0

Perché il downvote? Solo perché tutti hanno risposto la stessa cosa allo stesso tempo? – Jesper

+0

Perché ognuno ha dato la risposta "sbagliata". – Viruzzo

+1

Un sacco di persone non sono d'accordo sul fatto che questa sia una risposta "sbagliata". – Jesper

0

La separazione di cui si scrive non esiste in Java. È possibile separare le definizioni dei metodi (non statici) in un interface.

2

In Java non è possibile scegliere: il nome della classe è collegato al nome del file.Per un file di nome x/y/z/T.java dalla radice del file di origine, T.javadeve assomigliano:

package x.y.z; 

[some modifiers here] class T { 
    // class T here 
} 

ci sono modi per separare i "definizione di classe" da "implementazione", più vicino a quello che hai in mente è dichiarare un'interfaccia I e avere una classe C che implementa I. Considera anche classi astratte.

Un'interfaccia ha esattamente lo stesso vincolo ad eccezione si dichiara un interface invece di un class. Una classe astratta è solo una classe con il modificatore abstract.

0

No, questo tipo di separazione non è presente in Java. Ma guarda la parola chiave dell'interfaccia. puoi dichiarare le interfacce in modo esplicito!

+0

Non capisco perché -1. La risposta è breve, ma cosa c'è che non va? – ollins

Problemi correlati