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

时间:2016-08-23 04:48:44

标签: java arrays static

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

例如,下面的代码违反了OO方法,因为如果我有一个类型'X',那么作用于它的所有方法都应该在它里面:

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

如果他们采用以下方式实现会更好:

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

有人能解释一下吗?

8 个答案:

答案 0 :(得分:41)

在Java中,没有办法扩展数组的功能。数组都继承自Object,但这几乎没有。恕我直言这是Java的缺陷。

相反,要为数组添加功能,静态实用程序方法会添加到ArrayArrays等类中。这些方法是static,因为它们不是实例方法。

答案 1 :(得分:18)

很好的观察。另请注意,并非每个数组都可以进行排序。只能对实现Comparable接口的基元和对象数组进行排序。因此,不可能应用于所有数组的通用sort()方法。因此,对于每个实际可排序的受支持类型,我们都有几个重载的静态方法。

更新

@Holger在下面的评论中正确地指出,其中一个重载的静态方法确实是Arrays.sort(Object[]),但文档明确指出:

  

数组中的所有元素都必须实现Comparable接口。

因此,对于不实现Comparable或其子接口的对象,它不起作用。

答案 2 :(得分:13)

首先,Arrays是一个实用程序类,它完全相同:公开静态方法。它与任何arr[]实例分开,并且与它没有OO关系。有几个类,如Collections或各种StringUtils

数组是集合,它们用于存储数据。 Arrays.sort()是一种对集合进行排序的算法。可能有许多其他算法以不同的方式对数据进行排序,所有这些算法都将以相同的方式使用:MyAlgorithm.doSthWithArray(array)。即使数组上有sort()方法(它必须是SortableArray,因为并非所有对象都可以自动排序),所有其他算法都必须被称为老路无论如何。除非引入了访客模式......但这使事情变得太复杂,因此,没有任何意义。

对于Java集合Collections.sort(),即使在C ++中,std::sort也有类似的作用,C中的qsort也是如此。我在这里看不到问题,我看到了一致性。

答案 3 :(得分:3)

静态方法有时用于实用目的。 因此Arrays是用于通用数组操作的实用程序类。 同样,Collections也是Util类,其中给出了实用方法。

答案 4 :(得分:2)

阵列有点像二等泛型。当你创建一个数组时,它会为数组类型创建一个自定义类,但它并不是全功能的,因为它们决定了数组在真正充实语言之前的工作方式。

这与保持向后兼容性相结合,意味着Arrays坚持使用古老的界面。

这只是API的一个旧部分。

答案 5 :(得分:2)

数组不是存储状态的对象,超出数组int的实际值。换句话说,它只是一个愚蠢的容器"。它没有"知道"任何行为。

实用程序类是一个只有public static方法的类,它们是无状态函数。排序是无状态的,因为在调用该方法之间没有记住任何内容。它运行" standalone",将其公式应用于传入的任何对象,只要该对象是"可排序"。 Arrays类的第二个实例的行为没有区别,因此只需要一个static实例。

正如Dariusz指出的那样,有不同的排序方式。因此,您可以MyArrays.betterSort(array)以及Arrays.sort(array)

如果你想让数组"知道"如何最好地对自己的成员进行排序,您必须拥有自己的数组类extends数组。

但是如果你想在同一个阵列上不同时间进行不同的排序呢?也许是一个人为的例子,但是有很多类似的现实世界的例子。

现在你变得越来越复杂了。也许类型T的数组与类型S ....

的排序方式不同

使用静态实用程序和Comparator<T>接口使其变得简单。

答案 6 :(得分:1)

对我来说,这是一个完美的解决方案。我有一个数组,我有一个类,Arrays,它操作数组中的数据。例如,您可能希望保留一些随机数字,并且您永远不会想要排序或任何其他实用方法,您将收到您不想要的行为。这就是为什么在代码设计中将数据与行为分开是很好的。

您可以阅读single responsibility principle

答案 7 :(得分:1)

Arrays类包含独立于state的方法,因此它们应该是static。它本质上是一个实用类。

虽然OOP原则不适用,但是当前的方式更清晰,更简洁,更易读,因为您不必担心多态和继承。这一切都缩小了范围,最终reduces the chances that you screw something up

现在,您可能会问自己“为什么我不能在Java中扩展数组的功能?”。一个很好的答案是这个introduces potential security holes,它可能会破坏系统代码。