首页 > 解决方案 > Java 中静态 Util 类和方法的替代方案

问题描述

说,我想要这个方法,它需要一个 Set 并根据某种逻辑将其格式化为一个字符串。例如。

public String formatCustomerSet(final Set<Customer> customers) {
    String result = "";
    for (Customer customer : customers) {
        result += customer.getFirstName() + " : " + customer.getLastName() + "\n";
    }

    return result;
}

我在几个类中使用此代码。现在,我应该把这个放在哪里?我发现应该避免使用实用程序类,不应该使用? https://lostechies.com/chrismissal/2009/06/01/anti-patterns-and-worst-practices-utils-class/

那么,是否应该使用具有特定名称的 Util 类,例如 CustomerFormatter,还是应该使用它创建一个 OOP 类?推荐哪一个,为什么?

标签: javaoop

解决方案


我不同意应该避免使用 util 类的事实。拥有一个包含纯实用程序的静态方法的类是非常好的。有时函数或操作应该只是函数或操作。并不总是需要将它们与某些抽象对象类型或其他东西相关联。

但是,我同意的是,在制作实用程序类时,您应该严格定义该类将提供哪些类型的实用程序。如果你有一堆与做数学运算相关的静态方法,你可以创建一个 util 类ExtendedMath。如果你做了大量的数学课而这门课变得太肥了,试着进一步完善它。按数学类型(例如Algebra和)对它们进行分组Vector

最后,它大多只是试图使用常识。函数成为对象的一部分是否有意义,或者它可以只是一个任意操作?

在您的情况下,您必须问自己一个问题:“我想创建我的代码对formatCustomerSet实现的硬依赖吗?”。如果您 100% 确定您将始终以完全相同的方式格式化客户集,并且您永远不需要不同的格式化程序,那么使用静态方法可能是可以的。如果没有,那么最好将它CustomerSetFormatter作为非静态函数放在一个类中。

我不能给你一个是或不是的答案,因为你必须自己权衡利弊。只需考虑以下事项:

  • 当您引用静态方法时,您正在创建对该静态方法的硬依赖。有时这没关系,有时则不然。软件开发的一个核心原则是重用。您是否也可以在其他上下文中重用调用静态函数的代码?还是静态函数过于特定于上下文?
  • 编程中的另一个核心原则是依赖注入。假设您有Class A需要客户格式化程序。你能做的,是你能做一个interface CustomerFormatter. 然后在Class A你定义一个构造函数:A(CustomerFormatter formatter)。这允许您做的是 Class A在使用不同的CustomerFormatter实现时重用。这大大增加了Class A. 使用静态函数时,这不再可能。
  • 常见的泛型操作(例如在 中定义的函数,例如 或)Math完全保证是静态函数。他们做一件常用的事,而且只做一件事。通常,您可以以这样的函数为例,说明何时完全需要使用静态方法。min()max()ceil()floor()
  • 你的函数是纯函数吗?对于任何唯一输入,此函数始终提供完全相同的输出。如果输入保持不变,对相同函数的后续调用将始终产生相同的结果。如果是这种情况,那么将您的方法设置为静态就可以了。如果不是这种情况,并且对同一函数的后续调用会根据某些仲裁状态或之前完成的调用给出不同的输出,那么您应该考虑将其设为非静态。为相同的输入提供不同输出的静态函数,因为它们依赖于某些状态,通常被视为一种反模式

我希望这对你有所帮助。


推荐阅读