Java的Arrays.asList()是否违反了OOP?

时间:2013-06-12 14:47:26

标签: java arrays oop language-design static-methods

在Java中,我想将数组转换为列表。鉴于Java是一种OOP语言,我期望做类似的事情:

int[] myArray = { 1, 2, 3 };               // non-working code
List myList = myArray.toList();

但是当我发现array对象没有toList方法并且正确地执行我想要的方式时,我感到很惊讶:

int[] myArray = { 1, 2, 3 };               // working Java code
List myList = Arrays.asList(myArray);

起初我想知道int[]是否不被视为对象,但我能够在其上调用clone()等方法,所以我确信它是一个对象。

为什么Java的设计者使用第二种方法(静态方法与OOP不一致)与第一种方法(对象符合OOP原则的对象)?

我注意到C ++也做了类似于第二种方法的东西,我认为它是从C遗留下来的行李。但是在C#中,有一种ToList()方法。

Arrays.asList()是否只是支持OOP的进化游行,还是有一些基本理论可以这样做?

4 个答案:

答案 0 :(得分:3)

int []是一个对象。

但是,没有任何关于OOP的内容要求对象提供接受它作为参数的所有工厂方法。

答案 1 :(得分:3)

数组没有你可能期望它们拥有的各种方法,它所拥有的方法都是从Object继承而且通常是无用的。

int[] array = { 1, 2, 3 };
int[] array2 = { 1, 2, 3 };
System.out.println(array.equals(array2)); // prints false
System.out.println(array.hashCode() == array2.hashCode()); // prints false
System.out.println(array.toString()); // prints something like [I@a2634feg

我试图让Sun / Oracle解决这个问题但我回来的谣言是,正确修复它会非常复杂。

答案 2 :(得分:1)

从第一个版本(JDK1.0)开始,Java中存在数组(int[]Foo[])。对数据结构的支持很少 - 你必须自己完成所有这些。 V1.2(http://docs.oracle.com/javase/6/ocs/api/java/util/List.html)中引入了ListArrayList以及Arrays。当发生这种情况时,可能无法改变语言,或者当时它太复杂了。

我是Java早期(通过Sun联系人)的密切观察者。我记得Java 1.0是相当基础的,并且图形(AWT 1.02)是在最后一刻编写的。在我的回忆中,Java被设计为OO,但最初的范围有限(它被宣传为一种新的动画语言,但Java AWT 1.02非常有限)。那个时期的人工制品仍然存在于规范中。

当时Java的巨大贡献是WriteOnceRunAnywhere(WORA)(最初是WriteOnceDebugEverywhere!),我怀疑这是早期开发人员和维护人员的首要考虑因素。 Java由C ++通知并带有一些结构(例如int,double作为原语 - autoboxing后来作为kludge)。 C#能够从Java(而不是C ++)开始,并且在某些方面是对Java应该如何的修订。所有语言都从一些行李开始,每个新的语言都摆脱了一些。

答案 3 :(得分:1)

转换方法不是您期望的转换方法。而且没有真正的技术原因。如果你看一下Scala(它使用相同的VM,并且字节码是兼容的):

object ArrayListDemo {
  def main(args: Array[String]) {
    val list = args.toList
    val array = list.toArray

    println("= List =")
    println(list)
    println(list.mkString(", "))
    println(list.size)
    println(list.length)

    println("= Array =")
    println(array)
    println(array.mkString(", "))
    println(array.size)
    println(array.length)
  }
}

这会给你这个结果(如果用两个参数Helloworld调用):

  

= List =
  清单(你好,世界)
  你好,世界
  2
  2
  =数组=
  [Ljava.lang.String; @ 15663a2
  你好,世界
  2
  2

你可以看到它真的是一个“JVM阵列”,还有其他方法。 所有集合类型(丰富和原始)都有转换方法。

所以,是的,它不像OOP - 感觉“势在必行”。