2016-07-04 31 views
5

Patrząc na dokumentacji Font#loadFont natknąłem tej uwagi:Dlaczego `loadFont` nie zamyka strumienia wejściowego? Czy powinienem to zamknąć?

Metoda ta nie zamyka strumień wejściowy.

Niestety, nie jest to wyjaśnione ani rozszerzone. Więc moje pytanie brzmi:

  1. Jakie są możliwe powody, dla których API nie zamknie strumienia wejściowego? Czy najprawdopodobniej chciałbyś ponownie użyć strumienia? I głównie użyć tej metody tak:

    Font.loadFont(getClass().getResourceAsStream("path/to/font"), 13.0); 
    

    aby upewnić się, że czcionka jest dostępna dla mojej aplikacji, więc nigdy ponownie używać strumienia wejściowego, a ja naprawdę nie można myśleć o powód bym chcieć.

  2. Czy powinienem sam zamknąć strumień wejściowy? Czy powinienem spodziewać się problemów, jeśli nie zamykam strumienia wejściowego? W przeszłości miałem problemy z czcionką załadowaną w ten sposób, gdzie niektóre etykiety skonfigurowane z tą czcionką zaczęły wyświetlać kwadraty, podczas gdy inne (na tej samej scenie!) Działały poprawnie. Czy może to być związane z nie zamykaniem strumienia wejściowego?
+6

To dobra zasada, że ​​nie należy zamykać strumienia, który nie został otwarty. W tym przypadku metoda nie otwiera go, więc nie zamyka go. Na przykład, nie ma powodu, dla którego nie mógłbyś przekazać standardowego strumienia wejściowego: jeśli metoda zamknęła strumień parametrów, byłbyś wypchany, gdybyś musiał go otworzyć, by zrobić coś innego po nim. –

+0

I nie, nie powinieneś zamykać go samodzielnie: użyj try z zasobami. –

+1

@AndyTurner - użycie metody try-with-resources jest równoznaczne z zamknięciem go, po prostu cukier syntaktyczny. Chodziło mi o to, czy powinienem być odpowiedzialny za zamknięcie go, czy jest to uzasadnione, aby go otworzyć i nigdy go nie zamykać. – Itai

Odpowiedz

1

Dokumentacja każdego interfejsu API obejmującego zasoby rzadkie lub zewnętrzne (takie jak deskryptory plików lub strumienie) jasno określi, czyim obowiązkiem jest czyszczenie (w tym przypadku zamknięcie strumienia). Jest to czasami określane jako "własność".

W tym przypadku dokumentacja stwierdza, że ​​metoda loadFont nie przejmuje własności strumienia. Dlatego nadal należy do Ciebie: Twoim obowiązkiem jest zamknięcie strumienia.

Polecenie try-with-resources jest najlepszym sposobem, aby to zrobić.