【问题标题】:Java Utility Class vs. Service [closed]Java 实用程序类与服务 [关闭]
【发布时间】:2009-05-16 01:29:48
【问题描述】:

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

【问题讨论】:

    标签: java static service utility


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 静态变量将保留静态类的状态。并不是说我鼓励静态课程——我只是说...
      • 我见过的大多数静态类都是我所说的“我希望我是单身”模式的例子。
      • 静态类中的静态状态是我所知道的(如果不是最好的)进入并发问题的神奇世界的最好方法之一。只是说...
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我认为没有硬性规定。

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

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

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

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

        【讨论】:

          【解决方案5】:

          我之前在某个地方回答过这个问题,但我发现改变服务的行为非常容易——将它重构为多个服务——如果你使用静态类。

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

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

          【讨论】:

            猜你喜欢
            • 2012-08-23
            • 1970-01-01
            • 1970-01-01
            • 2012-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-03
            相关资源
            最近更新 更多