Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java实用程序类与服务_Java_Static_Service_Utility - Fatal编程技术网

Java实用程序类与服务

Java实用程序类与服务,java,static,service,utility,Java,Static,Service,Utility,在Java中,实用程序类(具有静态方法的类)和服务类(具有提供“服务”的公共方法的类)之间有什么区别。例如,可以认为加密对象(提供加密、解密、散列或获取salt值的方法)是服务提供者,但许多人使用静态方法将此功能分组到实用程序类中,如CryptoUtil.encrypt(…)。我正试图找出哪种方式遵循更好的“设计”。想法?区别在于服务类可能有状态。我所说的状态是指对话状态。考虑一个概念订购系统。< /P> interface OrderSystem { void login(String u

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

区别在于服务类可能有状态。我所说的状态是指对话状态。考虑一个概念订购系统。< /P>
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();
}
接口命令系统{
无效登录(字符串用户名、字符串密码);
列表搜索(字符串条件);
无效订单(项目);
无效订单(项目、整数数量);
无效更新(项目、整数数量);
无效删除(项目);
无效签出();
映射getCart();
无效注销();
}
这样的事情可以通过有状态会话bean来完成(例如),尽管在这种情况下,身份验证可能会被更传统的EJB机制所覆盖

这里的要点是存在会话状态,即一次调用的结果会影响后续调用。您可以将静态方法视为一组在本地执行的简单无状态服务

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

  • 有状态的
  • 遥远的;及
  • 依赖于实现(即通过接口)

我认为最佳实践是简单地使用静态方法作为方便方法(特别是考虑到Java缺乏扩展方法)。服务比这更丰富。

我认为没有硬性规定

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

  • 计算字符串的哈希值
  • 将日期转换为标准表示形式
如果一个功能需要许多参数,并且如果创建了几个相关的结果,那么更实际的做法是在其构造函数中有一个可以接受共享参数的类,以及执行实际操作的几个方法


典型示例:数据库连接,首先连接,然后使用它进行查询,然后使用它获得结果…

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


例如,您使用
encrypt
方法提到
CryptoUtil
。拥有支持不同加密策略、不同邮件收件人等的不同对象将非常有用。

我以前在某个地方回答过这个问题,但我发现,改变一个服务的行为非常容易——将其重构为多个服务——如果使用静态类,则需要进行非常重要的重构

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


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

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

静态变量将保留静态类的状态。我并不是在鼓励静态类——我只是说……我所看到的大多数静态类都是我所说的“我希望我是一个单例”模式的例子。静态类中的静态是我所知道的进入惊人的并发问题世界的最好方式之一(如果不是最好的话)。只是说。。。