Java Utility Class vs. Service [zamknięta]

zamknięte . To pytanie jest oparte na opinii . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Zaktualizuj pytanie, aby mogło być odpowiedź z faktami i cytatami przez edytując ten post .

Zamknięte 2 lata temu .

Popraw to pytanie

Jaka jest różnica w Javie między klasą narzędziową (klasą z metodami statycznymi) a klasą usługową (klasą z metodami publicznymi, która dostarcza "usługę"). Na przykład, jeden może twierdzić, że obiekt kryptograficzny (dostarczający metody szyfrowania, odszyfrowywania, hashowania lub uzyskiwania wartości salt) jest dostawcą usług, ale wielu grupuje tę funkcjonalność w klasę użyteczności ze statycznymi metodami, takimi jak CryptoUtil.encrypt(...). Staram się dowiedzieć, która droga podąża za lepszym "designem". Myśli?

Author: djunforgetable, 2009-05-16

5 answers

Różne zachowania można uzyskać za pomocą różnych obiektów usługowych. Statyczne metody w klasie użytkowej nie mogą zostać zamienione. Jest to niezwykle przydatne do testowania, zmiany implementacji i innych celów.

Na przykład, wspominasz CryptoUtil metodą 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.

 25
Author: erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-16 01:57:44

Różnica polega na tym, że klasy usług mogą mieć stan. A przez stan Mam na myśli stan konwersacyjny. Rozważmy hipotetyczny system zamówień.

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();
}

Można to zrobić za pomocą stateful session beans (jako przykład), chociaż w takim przypadku uwierzytelnianie prawdopodobnie obejmowałoby bardziej tradycyjne mechanizmy EJB.

Chodzi o to, że istnieje stan konwersacyjny, w którym wyniki jednego wywołania wpływają na kolejne wywołania. Możesz zobaczyć statyczne metody jako kilka proste bezstanowe usługi, które wykonują się lokalnie.

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

  • stateful;
  • zdalny; i
  • zależne od implementacji (tj. poprzez interfejs).

Najlepszą praktyką jest po prostu używanie metod statycznych jako metod wygodnych (szczególnie biorąc pod uwagę brak metod rozszerzeń Javy). Usługi są znacznie bogatsze.

 12
Author: cletus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-16 01:36:20

Nie można nadpisać metody statycznej, co może być ogromnym problemem w przypadku, gdy chcesz zaimplementować swoją usługę na dwa różne sposoby i przełączać się między nimi. Z tego powodu ograniczyłbym użycie statycznych klas użyteczności do prostych rzeczy, które "nigdy" (dla wystarczająco długiej wartości "nigdy" :)) muszą być zrobione w więcej niż jeden sposób.

 6
Author: quant_dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-17 12:37:30

Myślę, że nie ma twardych i szybkich zasad.

Zazwyczaj używam metod statycznych dla funkcjonalności, która wymaga kilku parametrów i może być wykonana w jednym wywołaniu metody. Przykład:

  • Oblicz wartość skrótu dla ciągu
  • Konwertuj datę na standardową reprezentację

Jeśli funkcjonalność wymaga wielu parametrów i jeśli powstaje kilka powiązanych wyników, to bardziej praktyczne jest posiadanie classe, które może akceptować wspólne parametry w jego konstruktorze, z kilkoma metodami, które wykonują rzeczywistą akcję.

Typowy przykład: połączenie z bazą danych, które najpierw łączysz, następnie używasz do wykonania zapytania, a następnie używasz do uzyskania wyniku...

 1
Author: sleske,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-16 01:41:08

Odpowiedziałem gdzieś wcześniej na to pytanie, ale odkryłem, że bardzo łatwo jest zmienić zachowanie usługi-zrefaktorować ją na wiele usług-gdzie potrzeba dość znaczącego refaktoringu, jeśli używasz klasy statycznej.

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

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

 0
Author: Bill K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-16 03:13:22