Java工具类与服务的区别

46

在Java中,实用程序类(具有静态方法的类)和服务类(具有公共方法并提供“服务”的类)之间有什么区别。例如,可以认为加密对象(提供加密、解密、哈希或获取盐值的方法)是服务提供者,但许多人将此功能分组到具有静态方法的实用程序类中,如CryptoUtil.encrypt(...)。我正试图弄清楚哪种方式更符合“设计”。您有什么想法?

5个回答

32
通过使用不同的服务对象可以获得不同的行为。在实用程序类中的静态方法无法被替换。这对于测试、更改实现和其他目的非常有用。
例如,您提到了一个具有加密方法的CryptoUtil。拥有不同的对象来支持不同的加密策略、不同的消息接收者等将非常有用。

14

区别在于服务类可能具有状态。而且我所说的状态是指对话状态。考虑一个概念性订购系统。


The difference is that service classes might have state. And by state, it refers to conversational state. Consider an imaginary 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();
}

这件事可以通过有状态会话bean (作为一个例子) 来完成,尽管在这种情况下,身份验证可能会使用更传统的 EJB 机制。

关键在于存在对话状态,在这种情况下,一次调用的结果会影响到后续的调用。您可以将静态方法视为一组本地执行的简单无状态服务。

服务具有更广泛的含义,包括但不限于:

  • 有状态;
  • 远程;和
  • 实现相关(即通过接口)。

我认为最佳做法是将静态方法仅用作方便的方法(特别是考虑到Java缺乏扩展方法)。服务比这要丰富得多。


1
一个静态变量将为静态类保留状态。我并不鼓励使用静态类,只是说一下... - Bill K
2
我看到的大多数带有静态状态的类都是我所谓的“我希望自己是单例模式”的示例。 - Paul Morie
静态类中的静态状态是我所知道的(如果不是最好的)进入并发问题惊人世界的最佳方式之一。只是说一下... - Tomas Narros

6

你无法覆盖静态方法,这可能是一个巨大的问题,因为如果你想以两种不同的方式实现服务并在它们之间切换,这将会很麻烦。因此,我建议限制使用静态工具类来处理简单的事情,这些事情“永远”(时间足够长的意义上)不需要以多种方式完成。


2

我认为这里没有硬性规定。

通常我会使用静态方法来实现需要少量参数且可以在单个方法调用中完成的功能。例如:

  • 计算字符串的哈希值
  • 将日期转换为标准表示

如果一个功能需要很多参数,并且有多个相关的结果被创建,那么更实际的做法是创建一个类,该类可以在其构造函数中接受共享参数,并具有执行实际操作的多个方法。

典型的例子:数据库连接,您首先连接,然后使用它进行查询,最后使用它获取结果...


0

我之前在这里回答过这个问题,但我发现如果使用静态类,改变服务的行为并将其重构为多个服务非常容易,而如果使用静态类,则需要进行相当大的重构。

如果这是唯一的区别(我相信是这样),那么使用静态类从来都没有任何意义。

每当有人说“永远不会超过1个这样的情况”,请编写n个它们的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接