Java Utility Class vs. Service [closed]

随声附和 提交于 2019-11-26 15:45:37

问题


What's the difference in Java between a utility class (a class with static methods) and a Service class (a class with public methods that provides a "service"). For example, one can argue that a cryptographic object (providing methods to encrypt, decrypt, hash or get a salt value) is a Service provider, but many group this functionality into a Utility class with static methods, like CryptoUtil.encrypt(...). I'm trying to figure out which way follows better "design". Thoughts?


回答1:


Different behaviors can be obtained by using different service objects. Static methods in a utility class can't be swapped out. This is extremely useful for testing, changing implementations, and other purposes.

For example, you mention a CryptoUtil with an encrypt method. It would extremely useful to have different objects that could support different encryption strategies, different message recipients, etc.




回答2:


The difference is that service classes might have state. And by state I mean conversational state. Consider a notional ordering system.

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

Such a thing could be done with stateful session beans (as one example), although in that case authentication would probably be covered more traditional EJB mechanisms.

The point here is that there is conversational state in that the results of one call affects subsequent calls. You could view static methods as a bunch of simple stateless services that execute locally.

A service has a much broader meaning that includes, but is not limited to, being:

  • stateful;
  • remote; and
  • implementation dependent (ie through an interface).

Best practice I think is to simply use static methods as convenience methods (especially given Java's lack of extension methods). Services are much richer than that.




回答3:


You cannot override static method, which can be a huge problem in case you'd like to implement your service in two different ways and switch between them. For this reason, I would limit the use of static utility classes to simple things which will "never" (for sufficiently long value of "never" :)) need to be done in more than one way.




回答4:


I think there are no hard and fast rules.

I typically use static methods for functionality that requires few parameters, and can be accomplished in a single method call. Example:

  • calculate a hash value for a string
  • convert a date to standard representation

If a functionality requires many parameters, and if there are several related results being created, then it's more practical to have a classe that can accept the shared parameters in its constructor, with several methods that perform the actual action.

Typical example: A database connection, which you first connect, then use to do a query, then use to get the result...




回答5:


I answered this question here somewhere before, but what I found was that it was very easy to change the behavior of a Service--to refactor it into multiple services--where it takes a pretty significant refactor if you use a static class.

If that is the only difference (and I believe it is), then it never makes any sense to use static classes.

Any time someone says "There will never ever ever be more than 1 of these", code for n of them.



来源:https://stackoverflow.com/questions/871434/java-utility-class-vs-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!