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

Aad*_* RF 34 java arrays static

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

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

int[] a = {34, 23, 12};
Arrays.sort(a);
Run Code Online (Sandbox Code Playgroud)

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

int[] a = {34, 23, 12};
a.sort();
Run Code Online (Sandbox Code Playgroud)

任何人都能解释一下这个吗?

Pet*_*rey 41

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

相反,为了添加数组的功能,静态实用程序方法被添加到类Array和的类中Arrays.这些方法static不是实例方法.

  • @Asaph`length`只读属性在JLS中定义,并具有自己的字节代码指令.`arraylength`扩展这个并不像在类中添加方法那么简单. (9认同)
  • 但java数组有一个`length`属性,它不是来自`Object`.那么为什么不能添加其他属性甚至方法呢? (6认同)
  • 我同意这是Java设计的一个缺陷.至少,equals(),hashCode()和toString()的实例版本应该已经适用于数组类.但由于严格的向后兼容性政策,他们拒绝这样做. (6认同)
  • @friendlydog你可以通过改变`Object.tostring()`http://vanillajava.blogspot.com.au/2016/03/printing-arrays-by-hacking-jvm.html的实现来添加到`toString()` (4认同)
  • 虽然我同意这个答案的后半部分,但我发现第一个是不正确的.Oracle(通过JCP)可以更新语言规范以向数组添加排序方法.但是,在Java中,数组比许多新语言中的数组要原始得多,所以我认为添加排序方法不是一个好主意,但如果他们有足够的动力就可以做到.在这种情况下,使用实用程序类更有意义. (2认同)

Asa*_*aph 18

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

更新:

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

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

因此它不适用于未实现的对象Comparable或其子接口之一.


Dar*_*usz 13

首先,Arrays是一个实用程序类,它正是这样做的:暴露静态方法.它与任何arr[]实例分开,并且与它没有OO关系.有几个类,像Collections或各种类StringUtils.

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

对于Java Collection来说Collections.sort(),即使在C++中也有std::sort类似的功能,就像qsort在C中一样.我没有看到问题,我看到一致性.

  • 请注意,在Java 8中有一个`List.sort`实例方法. (2认同)
  • 这是诊断OP(可理解的)误解的正确答案:`Arrays`不是数组的类型,因此它的静态方法不能在不改变语言的情况下成为数组的成员函数.这与`Integer`等包装器类型不同.(这些包装器,btw.,hybrids,因为它们是*携带值的对象以及底层基元的实用程序类,通过提供静态方法,如`static String toString( int i)`.) (2认同)
  • @Dariusz:它不仅仅是一个方便的方法,与`Collections`中的`static`方法不同,实现现在可以覆盖`sort`方法,广泛使用的`ArrayList`用于提高效率,而`synchronizedList`返回的列表这样做是为了提供先前版本中没有的线程安全性.关于类型安全性,尝试自然地对列表进行排序而没有声明的可比较元素类型总是通过`Collections.sort(list,null)`来工作.如果你不喜欢它,你可以使用`list.sort(Comparator.naturalOrder())`**检查完全像`Collections.sort(list)` (2认同)