java - Java 中静态 Util 类和方法的替代方案

标签 java oop

说,我想要这个方法,它需要一个 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/
那么,是否应该使用具有特定名称(如 CustomerFormatter)的 Util 类,还是应该使用它创建一个 OOP 类?推荐哪一个,为什么?

最佳答案

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

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

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

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

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

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

  • 我希望这对你有所帮助。

    关于java - Java 中静态 Util 类和方法的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58068322/

    相关文章:

    java - 如何将json对象传递给json数组

    java - 检查静态数组 : Java 中是否存在值

    java - Android:自定义RecyclerView中的单行

    java - 具有重复 Java 的结构(键、值)

    c++ - 如何检测是否将除整数以外的任何内容传递给我的类构造函数?

    javascript - 我怎样才能合并我的 JavaScript 文件并仍然让我的回调等待就绪状态?

    java - 如何从sharedPreference文件中获取键和值

    php - 有什么好的 php5 OOP 教程网站吗?

    C 中的类(不是 C++)

    ruby - 什么是 Ruby 中的 .NET 事件?