为什么Java中的'Arrays'类的方法都是静态的?

我正在阅读Java文档,并且我了解到Java中的Arrays类中的方法都是静态的。 我真的不明白为什么他们把它变成静态的原因。

例如,下面的代码违反了面向对象的方法,因为如果我有一个types“X”,那么作用于它的所有方法应该在其中:

 int[] a = {34, 23, 12}; Arrays.sort(a); 

如果他们实施了以下的方式会更好:

 int[] a = {34, 23, 12}; a.sort(); 

任何人都可以解释一下吗?

在Java中,无法扩展数组的function。 数组全部从Objectinheritance,但是这样做很less。 恕我直言,这是一个Java的缺陷。

相反,为了增加数组的function,静态工具方法被添加到像ArrayArrays这样的类中。 这些方法是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?”。 一个很好的答案是,这会引入潜在的安全漏洞 ,这可能会破坏系统代码。