2013-07-08 9 views
14

Może to być głupie, ale chcę poznać różnicę w działaniu tła.jaka jest różnica w korzystaniu z InputStream zamiast FileInputStream podczas tworzenia obiektu FileInputStream

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

Jaka jest różnica między tymi dwoma liniami kodu iw jakiej scenariusze są one wykorzystywane.

+0

FileInputStream pochodzi z InputStream - każda instancja FileInputStream jest z konieczności źródłem InputStream. Istnieje szersza preferencja, aby deklaracje były jak najbardziej abstrakcyjne. – user888379

+0

Nie ma żadnej różnicy, ponieważ robisz oba w obu przypadkach. – EJP

+1

Możliwy duplikat [Java - deklarowanie z typu interfejsu zamiast klasy] (http://stackoverflow.com/questions/3383726/java-declaring-from-interface-type-instead-of-class) – Tom

Odpowiedz

19

rozszerza InputStream: jest wyspecjalizowaną wersją InputStream przeznaczoną do odczytu plików.

Istnieje kilka implementacji obiektu InputStream zgodnie z jego użyciem.

Zazwyczaj dobrą praktyką jest użycie najwyższego typu wymaganego w kodzie. Dlatego jeśli twój kod musi odczytać dane z InputStream, ale nie specjalnie z FileInputStream, powinieneś użyć InputStream. Jednak, jeśli zachodzi potrzeba, aby informacje o obiekcie były FileInputStream, a nie tylko InputStream, należy zachować typ FileInputStream.

12

Nie ma prawdziwej różnicy. FileInputStream rozciąga się na InputStream, dzięki czemu można przypisać obiekt InputStream do obiektu FileInputStream. W końcu to ten sam obiekt, więc te same operacje się zdarzą.

To zachowanie jest nazywane Polymorphism i jest bardzo ważne w programowaniu obiektowym.

Twoja pierwsza linia kodu jest prawdopodobnie bardziej pożądana niż druga, ponieważ nie blokuje Cię w FileInputStream.

Jest to jedna z mocnych stron programowania obiektowego. Brak określenia typu pozwala na zmianę rodzaju strumienia, z którego korzystasz później. Jeśli jesteś pewien, że będziesz potrzebować tutaj tylko FileInputStream, użyj drugiej linii kodu.

2

Nie ma różnicy. W każdym przypadku tworzysz FileInputStream. Pierwszym z nich jest prawdopodobnie lepszy styl programowania, ponieważ zazwyczaj należy używać klas interface zamiast konkretnej klasy, aby umożliwić elastyczność (np. Zdecydować się na użycie BufferedInputStream).

4

Podobnie jak w przypadku innego stanu odpowiedzi, nie ma różnicy w zachowaniu. Nadal jest ten sam obiekt i te same metody zostaną wykonane. Możesz przypisać obiekt dowolnego typu, który dziedziczy InputStream do tej zmiennej.

Jednak do tej pory nikt nie wspominał: Można tylko wywoływać operacje, które są zadeklarowane w InputStream dla tej zmiennej. Jeśli FileInputStream oferuje dodatkowe operacje, kompilator zgłosiłby błąd, jeśli spróbujesz go wywołać. W takim przypadku musisz wpisać FileInputStream jako typ zmiennej.

3

Pozostałe odpowiedzi zostały już prawie przybite, ale chciałbym dodać następujący fragment.

Jeśli typ zmiennej referencyjnej dotyczy wyłącznie wewnętrznej informacji o implementacji Twojej klasy, tj.żadna inna klasa nigdy się o tym nie dowie, bezpośrednio lub pośrednio, wtedy naprawdę nie ma różnicy między tymi dwoma stwierdzeniami, mimo że programowałem przeciwko bardziej podstawowemu typowi (InputStream) tylko dlatego.

Jednakże, jeśli istnieje nawet najmniejszy ślad wycieku specyficznego zachowania FileInputStream poprzez interfejs klasy, bez tego, że jest to istotne dla problemu, który próbujesz rozwiązać, zawsze powinieneś programować na bardziej podstawowy typ.

Oczywiście jest to ogólna dobra praktyka i dotyczy więcej niż InputStreams i tym podobnych.

+0

Dobry dodatek, dobra robota. –

Powiązane problemy