在 Java 中,实用程序类(具有静态方法的类)和服务类(具有提供“服务”的公共方法的类)之间有什么区别?例如,人们可能会认为加密对象(提供加密、解密、散列或获取盐值的方法)是一个服务提供者,但许多人将此功能分组到具有静态方法的实用程序类中,例如 CryptoUtil.encrypt(.. .)。我试图找出哪种方式遵循更好的“设计”。想法?

有帮助吗?

解决方案

不同的行为可以通过使用不同的服务对象而获得。在一个工具类静态方法不能被交换出去。这对于测试,改变实施,以及其他用途非常有用。

例如,你提到用CryptoUtil方法的encrypt。这将非常有用的,可以支持不同的加密策略不同的对象,不同的消息的收件人等

其他提示

不同之处在于服务类可能有状态。我所说的状态是指会话状态。考虑一个名义上的订购系统。

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的这些”,代码为他们的n个。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top