2013-07-08 15 views
14

Questo può essere uno sciocco, ma desidero conoscere la differenza dell'operazione in background.Qual è la differenza nell'uso di InputStream invece di FileInputStream durante la creazione dell'oggetto FileInputStream

  1. InputStream is = new FileInputStream(filepath);
  2. FileInputStream is = new FileInputStream(filepath);

Qual è la differenza tra queste due linee di codice e in quali scenari sono hanno usato.

+0

FileInputStream è derivato da InputStream - qualsiasi istanza FileInputStream è necessariamente un InputStream. C'è una grande preferenza per rendere le dichiarazioni più astratte possibili. – user888379

+0

Non vi sono differenze, in entrambi i casi. – EJP

+1

Possibile duplicato di [Java - dichiarando dal tipo di interfaccia invece che dalla classe] (http://stackoverflow.com/questions/3383726/java-declaring-from-interface-type-instead-of-class) – Tom

risposta

19

FileInputStream estende InputStream: è una versione specializzata di un InputStream progettato per la lettura di file.

Esistono diverse implementazioni di un InputStream in base all'uso di esso.

In genere è buona norma utilizzare il tipo più elevato necessario nel codice. Pertanto se il tuo codice deve leggere i dati da un InputStream ma non specificamente da un FileInputStream, devi usare InputStream. Tuttavia, se è necessario mantenere le informazioni dell'oggetto come FileInputStream e non solo InputStream, è necessario mantenere il tipo FileInputStream.

12

Non c'è alcuna differenza reale. FileInputStream estende InputStream e pertanto è possibile assegnare un oggetto InputStream come un oggetto FileInputStream. Alla fine, è lo stesso oggetto, quindi le stesse operazioni avverranno.

Questo comportamento è chiamato Polymorphism ed è molto importante nella programmazione orientata agli oggetti.

La prima riga di codice è probabilmente più desiderabile della seconda in quanto non vi blocca in uno FileInputStream.

Questo è uno dei punti di forza della programmazione orientata agli oggetti. La mancata specificazione di un tipo ti consente di cambiare in seguito il tipo di stream che stai utilizzando. Se sei sicuro di aver sempre bisogno solo di uno FileInputStream, usa la seconda riga di codice.

2

Non c'è differenza. In ogni caso si sta creando un FileInputStream. Il primo è probabilmente uno stile di programmazione migliore in quanto dovresti generalmente usare una classe interface invece della classe concreta per consentire flessibilità (ad esempio, decidi di utilizzare uno BufferedInputStream).

4

Come l'altro stato della risposta, non vi è alcuna differenza nel comportamento. È ancora lo stesso oggetto e verranno eseguiti gli stessi metodi. È possibile assegnare un oggetto di qualsiasi tipo che eredita InputStream a tale variabile.

Tuttavia, ciò che nessuno menzionato finora è: è possibile chiamare solo le operazioni dichiarate in InputStream su tale variabile. Se FileInputStream offrisse alcune operazioni aggiuntive, il compilatore genererebbe un errore se provate a chiamarlo. In questo caso è necessario utilizzare FileInputStream come tipo della variabile.

3

Le altre risposte lo hanno praticamente inchiodato, ma vorrei aggiungere il seguente bit.

Se il tipo della variabile di riferimento is è un valore di implementazione interna della classe, ad es.nessun'altra classe potrà mai scoprirlo, direttamente o indirettamente, quindi non c'è davvero alcuna differenza tra le due affermazioni, anche se programmerei il tipo più elementare (InputStream) solo perché.

Tuttavia, se c'è anche il minimo indizio di far filtrare il comportamento specifico di FileInputStream attraverso l'interfaccia della classe, senza che ciò sia essenziale per il problema che si sta tentando di risolvere, si dovrebbe sempre programmare contro il tipo più di base.

Naturalmente, questa è una buona pratica generale e si applica a più di InputStreams e simili.

+0

Buona aggiunta, buon lavoro. –