Implementación de clase de sistema Java

8

La Systemclase Java contiene varios miembros de datos y métodos que tienen mucho sentido estar allí. Por ejemplo:

System.in (variable)
System.err (variable)
System.out (variable)
System.exit(int)
System.gc()
System.getSecurityManager()

Sin embargo, hay un método que no entiendo al estar allí:

System.arraycopy(Object, int, Object, int int)

Copiar una matriz a otra me parece que pertenece a la Arraysclase; siguiente de la documentación:

Esta clase contiene varios métodos para manipular matrices (como ordenar y buscar). Esta clase también contiene una fábrica estática que permite que las matrices se vean como listas.

Los métodos para manipular matrices es lo que me lleva a esta conclusión, ya que copiar una matriz a otra es seguramente una manipulación de la matriz , ¿verdad?

Entonces mi pregunta: ¿por qué está arraycopy()adentro System?

¿Es una reliquia de una Systemimplementación temprana de la clase Java ? El método no está marcado como obsoleto, por lo que estoy un poco perdido. Además, no sigue el estándar Java camelCase, lo que me hace volver a pensar que es una reliquia del diseño inicial de la biblioteca.

Chris Cirefice
fuente
Probablemente porque solía no haber un buen lugar para colocarlo, y ahora es demasiado tarde para moverlo.
user253751

Respuestas:

8

System.arraycopyse implementa de forma nativa por cada JVM. Aquí está la declaración del método:

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

Esto significa que realiza la copia de la matriz de la manera más rápida posible en las instrucciones de ensamblaje nativas. La idea es que esta es una funcionalidad potencialmente lenta y tan necesaria que Java debería proporcionar este comportamiento a un nivel bajo.

Otras formas de copiar matrices pueden envolver System.arraycopyo usar bucles interpretados, que no serían tan efectivos.

durron597
fuente
Bien, esto tiene un poco de sentido ahora; No sabía que cada JVM tenía su propia implementación de esto. Dicho esto, ¿están todos los native métodos en System? Al nombrar la convención, tiene sentido, ya que dependen del sistema , pero desde el punto de vista de la organización, arraycopytendría sentido que se definiera en la Arrayclase o algo similar, y tuviera su implementación nativa allí. Personalmente, he usado arraycopysolo una vez en mis 5 años de programación.
Chris Cirefice
55
Todavía está allí por razones de compatibilidad con versiones anteriores. Además, aunque no todos los nativemétodos están disponibles System, no hay nativemétodos en java.util.Arrays.
durron597
Ya veo, bueno, eso aclara las preguntas que tenía, ¡gracias!
Chris Cirefice
4

¿Es una reliquia de una implementación temprana de la clase del sistema Java?

System.arraycopy es una de las partes más antiguas de la biblioteca, mientras que java.util.Arrays se agregó en 1.2. No llamaría a arraycopy una reliquia ya que no hay nada que lo reemplace directamente, y los diversos métodos de copia en Arrays se implementan en términos de ello.

No hay nada especial sobre System o Arrays que requiera que los métodos nativos estén en uno o que eviten que estén en el otro.

Gatkin
fuente