[英]Alternative to static Util Classes and Methods in Java
说,我想要这个方法,它需要一个 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 class (例如使用的 CustomerFormatter)还是我们应该使用 OOP class ? 推荐哪一个,为什么?
我在几个类中使用此代码。 现在,我应该把这个放在哪里? 我发现应该避免使用实用程序类,不应该使用? https://lostechies.com/chrismissal/2009/06/01/anti-patterns-and-worst-practices-utils-class/
那么,它应该是使用特定名称的 Util class (例如使用的 CustomerFormatter)还是我们应该使用 OOP class ? 推荐哪一个,为什么?
使用 Java 流,您实际上可以通过以下单行获得所需的内容(假设Customer
类中有一个好的toString()
):
String result =
customers.stream().map(Customer::toString).collect(Collectors.joining("\n"));
放置它的一个好地方可能是Customer
class 本身。 但我会开始使用它,只有在收集了一些有关用例的信息后,我才会考虑将其重构为独立的 class。
编辑(对评论的回答) :是的,我首先在Customer
class 中将此方法设为 static 方法,因为它确实不使用该 class 中的任何字段。
编辑 2(注):顺便说一下,如果您想在问题中使用该方法,请考虑使用StringBuilder
而不是String
。
我不同意应避免使用 util 类的事实。 拥有一个包含纯实用程序的 static 方法的 class 是非常好的。 有时函数或操作应该只是函数或操作。 并不总是需要将它们与一些抽象的 object 类型或其他类型相关联。
但是,我同意的是,在制作实用程序类时,您应该严格定义 class 将提供哪些类型的实用程序。 如果您有一堆与进行数学运算相关的 static 方法,您可以制作一个 util class ExtendedMath
。 如果您正在做大量的数学运算并且 class 变得太胖,请尝试进一步完善它。 按数学类型(例如Algebra
和Vector
)对它们进行分组。
最后,它大多只是试图使用常识。 function 成为 object 的一部分是否有意义,或者它只是一个任意操作?
在您的情况下,您必须问自己一个问题:“我想创建我的代码对formatCustomerSet
实现的硬依赖吗?”。 如果您 100% 确定您将始终以完全相同的方式格式化客户集,并且您永远不需要不同的格式化程序,那么使用 static 方法可能没问题。 如果没有,那么最好将其作为非静态 function 放在CustomerSetFormatter
class 上。
我不能给你一个是或不是的答案,因为你必须自己权衡利弊。 只需考虑以下事项:
Class A
你可以做的是,你可以制作一个interface CustomerFormatter
。 然后在Class A
定义一个构造函数: A(CustomerFormatter formatter)
。 这允许您做的是在使用不同的CustomerFormatter
实现时重用Class A
这大大增加了Class A
的可重用性。 当使用 static 函数时,这不再可能。Math
中定义的函数,例如min()
、 max()
、 ceil()
或floor()
)完全保证是 static 函数。 他们做一件常用的事,而且只做一件事。 通常,您可以将这样的功能作为 static 方法完全保证的示例。我希望这对你有所帮助。
在大多数情况下,最好将行为作为非静态方法直接添加到已经存在的类中。 如果您真的想重用它,最好创建一个具有所需行为的新 class 但作为常规 class,它需要被实例化并且可以被子类化。
实用程序/静态类的缺点:主要问题是 class 取决于来自实用程序 Class 的 static 方法具有紧密耦合
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.