我正在阅读Java文档,并且我了解到Java中Arrays
类中的方法都是静态的。我真的不明白为什么他们把它变成静态的原因。
例如,下面的代码违反了OO方法,因为如果我有一个类型'X',那么作用于它的所有方法都应该在它里面:
int[] a = {34, 23, 12};
Arrays.sort(a);
如果他们采用以下方式实现会更好:
int[] a = {34, 23, 12};
a.sort();
有人能解释一下吗?
答案 0 :(得分:41)
在Java中,没有办法扩展数组的功能。数组都继承自Object
,但这几乎没有。恕我直言这是Java的缺陷。
相反,要为数组添加功能,静态实用程序方法会添加到Array
和Arrays
等类中。这些方法是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,它操作数组中的数据。例如,您可能希望保留一些随机数字,并且您永远不会想要排序或任何其他实用方法,您将收到您不想要的行为。这就是为什么在代码设计中将数据与行为分开是很好的。
答案 7 :(得分:1)
Arrays
类包含独立于state的方法,因此它们应该是static
。它本质上是一个实用类。
虽然OOP原则不适用,但是当前的方式更清晰,更简洁,更易读,因为您不必担心多态和继承。这一切都缩小了范围,最终reduces the chances that you screw something up。
现在,您可能会问自己“为什么我不能在Java中扩展数组的功能?”。一个很好的答案是这个introduces potential security holes,它可能会破坏系统代码。