2012-08-25 17 views
7

Załóżmy, że masz klasę FileReader za pomocą metody read.Klasy "Do-er" a statyczne metody użytkowe

Rozumiem, że atrybuty na poziomie klasy mogą uzasadniać posiadanie instancji. Co jednak oznacza zatrzymanie tworzenia równoważnej klasy ReaderUtils poprzez pociągnięcie tych samych atrybutów do zakresu odpowiedniej metody staticread?

W skrócie, co dokładnie uzasadnia klasę "Doer" w odniesieniu do metod statycznych?

+4

Nic nie powstrzymuje nikogo przed zrobieniem odpowiednika "ReaderUtils", w rzeczywistości jest zaimplementowane w środowisku JRE: ['Files.readAllLines'] (http://docs.oracle.com/javase/7/docs/api /java/nio/file/Files.html#readAllLines%28java.nio.file.Path,%20java.nio.charset.Charset%29). – Jeffrey

Odpowiedz

2

Istotą OOP jest enkapsulacja stanu/danych wraz z powiązanym zachowaniem. Statyczne metody użyteczności są zbliżone do globalnych funkcji w języku proceduralnym - oddzielasz zachowanie (metodę statyczną) od stanu (parametry do tej metody), tym samym łamiąc hermetyzację.

Co to oznacza w praktyce? Zamiast zadzwonić pod numer reader.read(), musisz zadzwonić pod numer ReaderUtils.read(file), co oznacza, że ​​jesteś teraz ściśle powiązany z implementacją - podałeś domyślne założenie, że zawsze będziesz używać ReaderUtils i zawsze będziesz przekazywał plik.

Jeśli zamiast używać rodzajowe Reader interfejs, można użyć FileReader dzisiaj ale zamienić ją na DatabaseReader lub HttpReader jutra bez konieczności zmiany inny kod - wszystkie połączenia reader.read() będą nadal działać tak samo.

2

Interfejsy nie mogą być zaimplementowane statycznie - zaimplementowane metody interfejsu muszą mieć postać instancji metody. W związku z tym zabrania to sprawdzania "klasy narzędziowej" jako implementacji środowiska wykonawczego w celu świadczenia niektórych usług - musi to być instancja klasy. Jest to jeden z głównych powodów istnienia klas "doer".

Klasy użyteczności są w porządku, jeśli implementacja jest znana w czasie kompilacji, a ponieważ są to metody statyczne, są bardziej prawdopodobne, że w naturalny sposób są bezpaństwowcami (wystarczy się upewnić, że pola statyczne są niezmienne/bezstanowe), co jest wymagane przez typowe serwery, które obsługują żąda jednocześnie.

1

Jest to kwestia preferencji. Ogólnie rzecz biorąc, Java faworyzuje rzeczowniki (ponieważ ludzie uważają, że jest to więcej OO), dlatego FileReader.

Jak zauważył Jeffrey, czasami obsesja rzeczownika prowadzi do niepotrzebnej gadatliwości, w której to punkcie wywołania zostają zawinięte w statyczne metody.

+1

Niezupełnie w 100%, ale to przypomina mi, jak ludzie tak bardzo kochają fabryki w Javie ... http://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/server/RequestProcessorFactoryFactory – Mehrdad