2009-05-16 7 views
30

Jaka jest różnica w Javie między klasą narzędzia (klasa z metodami statycznymi) a klasą usługi (klasa z publicznymi metodami zapewniającymi "usługę"). Na przykład można argumentować, że obiekt kryptograficzny (dostarczający metody szyfrowania, odszyfrowywania, mieszania lub uzyskiwania wartości soli) jest dostawcą usługi, ale wielu grupuje tę funkcjonalność w klasę Utility z metodami statycznymi, takimi jak CryptoUtil.encrypt (.. .). Próbuję dowiedzieć się, która droga podąża za lepszym "projektem". Myśli?Java Utility Class vs. Service

Odpowiedz

19

różnych zachowań można uzyskać stosując różne obiekty usługowe. Metody statyczne w klasie narzędziowej nie mogą być zamienione. Jest to niezwykle przydatne przy testowaniu, zmianie implementacji i innych celach.

Na przykład wspomniano o CryptoUtil przy użyciu metody encrypt. Bardzo przydatne byłoby posiadanie różnych obiektów, które mogłyby obsługiwać różne strategie szyfrowania, różnych odbiorców wiadomości itp.

7

Różnica polega na tym, że klasy usług mogą mieć stan. I przez państwo mam na myśli stan konwersacji. Rozważmy hipotetyczny system zamawiania.

interface OrderSystem { 
    void login(String username, String password); 
    List<Item> search(String criteria); 
    void order(Item item); 
    void order(Item item, int quantity); 
    void update(Item item, int quantity); 
    void remove(Item item); 
    void checkout(); 
    Map<Item, Integer> getCart(); 
    void logout(); 
} 

Takie rzeczy można zrobić z fasoli stanowych sesji (jako przykład), choć w tym przypadku uwierzytelniania prawdopodobnie podlegać bardziej tradycyjnych mechanizmów EJB.

Chodzi o to, że istnieje stan konwersacji, ponieważ wyniki jednego połączenia wpływają na kolejne połączenia. Możesz zobaczyć statyczne metody jako grupę prostych bezpaństwowych usług, które są uruchamiane lokalnie.

Usługa ma znacznie szersze znaczenie, które obejmuje, ale nie ogranicza się do nich, są:

  • Stateful;
  • zdalna; i
  • implementacja zależna (tj. przez interfejs).

Najlepsza praktyka myślę jest po prostu użyć metody statyczne jak metod wygody (zwłaszcza brak danych Java metod rozszerzenie). Usługi są znacznie bogatsze.

+1

Zmienna statyczna zachowuje stan dla klasy statycznej. Nie dlatego, że zachęcam do tworzenia klas statycznych - mówię po prostu ... –

+2

Większość klas, które widziałem ze statycznym stanem, to przykłady tego, co nazywam "wzorowaniem się na singlet". –

+0

Stan statyczny w klasie statycznej jest jednym z najlepszych sposobów, w jaki znam (jeśli nie najlepszy), aby dostać się do Niesamowitego Świata Współbieżności. Tylko mówię'... –

0

Myślę, że nie ma sztywnych reguł.

Zazwyczaj używam metod statycznych dla funkcji, która wymaga kilku parametrów, i można je wykonać w jednym wywołaniu metody. Przykład:

  • obliczyć wartość skrótu na sznurku
  • przekonwertować datę standardowej reprezentacji

Jeśli funkcja wymaga wielu parametrów, a jeśli istnieje kilka podobnych ogłoszeń powstaje, to jest to bardziej praktyczne, aby mieć klasę, która może akceptować wspólne parametry w swoim konstruktorze, za pomocą kilku metod, które wykonują rzeczywistą akcję.

Typowy przykład: Połączenie bazy danych, która najpierw połączyć, a następnie użyć zrobić kwerendę, a następnie użyć, aby uzyskać wynik ...

0

Odpowiedziałem już gdzieś na to pytanie, ale odkryłem, że bardzo łatwo można zmienić zachowanie usługi - zreorganizować ją na wiele usług - gdzie zajmuje ona całkiem znaczący refaktor, jeśli używa się klasa statyczna.

Jeśli jest to jedyna różnica (i uważam, że tak), to nigdy nie ma sensu używać klas statycznych.

Za każdym razem, gdy ktoś mówi "Nigdy więcej nie będzie więcej niż 1", kod dla n z nich.

3

Nie można zastąpić metody statycznej, co może stanowić ogromny problem w przypadku, gdy chcesz wdrożyć usługę na dwa różne sposoby i przełączać się między nimi. Z tego powodu ograniczyłbym używanie statycznych klas użytkowych do prostych rzeczy, które "nigdy" (za wystarczająco długą wartość "nigdy" :)) muszą być wykonane na więcej niż jeden sposób.