Java实用工具类与服务

时间:2009-05-16 01:29:48

标签: java static service utility

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

5 个答案:

答案 0 :(得分:22)

使用不同的服务对象可以获得不同的行为。实用程序类中的静态方法无法换出。这对于测试,更改实现和其他目的非常有用。

例如,您使用CryptoUtil方法提及encrypt。拥有可以支持不同加密策略,不同消息接收者等的不同对象非常有用。

答案 1 :(得分:8)

不同之处在于服务类可能具有状态。从州到我的意思是会话状态。考虑一个名义订购系统。

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缺少扩展方法)。服务比这更丰富。

答案 2 :(得分:4)

您无法覆盖静态方法,如果您希望以两种不同的方式实现服务并在它们之间切换,这可能是一个巨大的问题。出于这个原因,我将限制静态实用程序类的使用限制为“永远”(对于“从不”:)的足够长的值的简单事物需要以多种方式完成。

答案 3 :(得分:0)

我认为没有严格的规则。

我通常将静态方法用于需要很少参数的功能,并且可以在单个方法调用中完成。例如:

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

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

典型示例:首先连接的数据库连接,然后用于执行查询,然后用于获取结果...

答案 4 :(得分:0)

我之前在某处回答过这个问题,但我发现很容易改变服务的行为 - 将其重构为多个服务 - 如果你使用静态的话需要一个非常重要的重构类。

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

任何时候有人说“永远不会超过其中的1个”,代码为n个。