在Java中,实用程序类(具有静态方法的类)和服务类(具有公共方法并提供“服务”的类)之间有什么区别。例如,可以认为加密对象(提供加密、解密、哈希或获取盐值的方法)是服务提供者,但许多人将此功能分组到具有静态方法的实用程序类中,如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个它们的代码。