Java实用工具类与服务

dju*_*ble 36 java service static utility

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

eri*_*son 23

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

例如,您提到了CryptoUtil一个encrypt方法.拥有可支持不同加密策略,不同邮件收件人等的不同对象非常有用.


cle*_*tus 10

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

这里的要点是存在会话状态,因为一个呼叫的结果会影响后续呼叫.您可以将静态方法视为一组在本地执行的简单无状态服务.

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

  • 状态;
  • 远程; 和
  • 依赖于实现(即通过接口).

我认为最好的做法是简单地使用静态方法作为便捷方法(特别是考虑到Java缺乏扩展方法).服务比这更丰富.

  • 我在静态中看到的大多数类都是我称之为'我希望我是单身'模式的例子. (2认同)

qua*_*dev 6

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