为什么Java中的'Arrays'类的方法都是静态的?
我正在阅读Java文档,并且我了解到Java中的Arrays
类中的方法都是静态的。 我真的不明白为什么他们把它变成静态的原因。
例如,下面的代码违反了面向对象的方法,因为如果我有一个types“X”,那么作用于它的所有方法应该在其中:
int[] a = {34, 23, 12}; Arrays.sort(a);
如果他们实施了以下的方式会更好:
int[] a = {34, 23, 12}; a.sort();
任何人都可以解释一下吗?
在Java中,无法扩展数组的function。 数组全部从Object
inheritance,但是这样做很less。 恕我直言,这是一个Java的缺陷。
相反,为了增加数组的function,静态工具方法被添加到像Array
和Arrays
这样的类中。 这些方法是static
因为它们不是实例方法。
好的观察。 还要注意的是并不是每个数组都可以被sorting。 只有实现了Comparable
接口的基元和对象的数组才能被sorting。 所以适用于所有数组的一般sort()
方法是不可能的。 因此,对于每个实际可sorting的支持types,我们有几个重载的静态方法。
更新:
@Holger在下面的注释中正确地指出了一个重载的静态方法的确是Arrays.sort(Object[])
但是这个文档明确指出:
数组中的所有元素都必须实现
Comparable
接口。
所以它不适用于没有实现Comparable
或其子接口的对象。
首先, Arrays
是一个实用工具类,它正是这样做的:暴露静态方法。 它与任何arr[]
实例是分开的,并且与它没有OO关系。 有像这样的几个类,像Collections
或各种StringUtils
。
数组是集合,它们被用来存储数据。 Arrays.sort()
是对集合进行sorting的algorithm。 可能有许多其他algorithm以不同的方式对数据进行sorting,所有这些algorithm都将以相同的方式使用: MyAlgorithm.doSthWithArray(array)
。 即使数组有一个sort()
方法(它必须是一个SortableArray
,因为并不是所有的对象都可以被自动sorting),所有其他的algorithm都必须以旧方式调用。 除非介绍访客模式…但是这使得事情太复杂,因此没有任何意义。
对于一个java集合有Collections.sort()
,即使在C ++中也有std::sort
,与C中的qsort
相似。 我在这里没有看到问题,我看到一致性。
静态方法有时用于实用目的。 所以Arrays是通用数组操作的实用类。 类似地, 集合也是Util类,其中给出了实用方法。
数组有点像二stream的generics。 当你创build一个数组的时候,它会为数组types创build一个自定义的类,但是它并不是全function的,因为他们决定了在数据库真正充实语言之前数组是如何工作的。
结合维护向下兼容性,意味着arrays卡住了一个古老的界面。
这只是API的一个老部分。
一个数组不是一个存储状态的对象,超出了int数组的实际值。 换句话说,这只是一个“哑巴容器”。 它不会“知道”任何行为。
一个实用类是一个只有public static
方法的类,它是无状态函数。 sorting是无状态的,因为在调用该方法之间没有任何记忆。 它运行“独立”,只要该对象是“可sorting的”,就将其公式应用于传入的任何对象。 Arrays
类的第二个实例没有不同的行为,所以只需要一个static
实例。
正如Dariusz所指出的,有不同的sorting方式。 所以你可以有MyArrays.betterSort(array)
和Arrays.sort(array)
。
如果你想让数组“知道”如何最好地sorting自己的成员,你必须有你自己的数组类来extends
数组。
但是如果你有一种情况,你想在同一个arrays的不同时间进行不同的sorting呢? 也许是一个人为的例子,但也有很多类似的现实世界的例子。
现在你变得越来越复杂了。 也许一个typesT
的数组sorting不同于typesS
….
使用静态工具和Comparator<T>
界面使其变得简单。
对我来说这是一个完美的解决scheme。 我有一个数组,我有一个类Arrays,它对数组中的数据进行操作。 例如,您可能想要保留一些随机数字,您将永远不想sorting或任何其他实用工具方法,您将收到您不想要的行为。 这就是为什么在代码devise中将数据与行为分开的原因。
你可以阅读关于单一责任原则 。
Arrays
类包含独立于状态的方法,所以它们应该是static
。 它本质上是一个实用程序类。
虽然OOP原则不适用,但由于您不必担心多态性和inheritance性,因此目前的方法更清晰,更简洁,更具可读性。 这一切都会缩小范围,最终减less你搞砸的机会 。
现在,您可能会问自己:“为什么我不能在Java中扩展数组的function?”。 一个很好的答案是,这会引入潜在的安全漏洞 ,这可能会破坏系统代码。