Java es un lenguaje de programación orientado a objetos , basado en clases y de alto nivel que está diseñado para tener la menor cantidad de dependencias de implementación posible. Es un lenguaje de programación de propósito general destinado a permitir a los programadores escribir una vez y ejecutar en cualquier lugar ( WORA ), [16] lo que significa que el código Java compilado puede ejecutarse en todas las plataformas que admitan Java sin la necesidad de volver a compilarlo. [17] Las aplicaciones Java generalmente se compilan en código de bytes que puede ejecutarse en cualquier máquina virtual Java (JVM) independientemente de la arquitectura de la computadora subyacente . La sintaxis de Java es similar a la de C y C++ , pero tiene menos funciones de bajo nivel que cualquiera de ellos. El tiempo de ejecución de Java proporciona capacidades dinámicas (como reflexión y modificación del código de tiempo de ejecución) que normalmente no están disponibles en los lenguajes compilados tradicionales.
Java ganó popularidad poco después de su lanzamiento y desde entonces ha sido un lenguaje de programación muy popular. [18] Java fue el tercer lenguaje de programación más popular en 2022 [actualizar]según GitHub . [19] Aunque sigue siendo muy popular, ha habido una disminución gradual en el uso de Java en los últimos años y otros lenguajes que utilizan JVM están ganando popularidad. [20]
Java fue desarrollado originalmente por James Gosling en Sun Microsystems . Fue lanzado en mayo de 1995 como un componente central de la plataforma Java de Sun. La implementación original y de referencia de los compiladores Java , las máquinas virtuales y las bibliotecas de clases fueron publicadas originalmente por Sun bajo licencias propietarias . En mayo de 2007, de conformidad con las especificaciones del Proceso comunitario de Java , Sun había vuelto a otorgar licencias para la mayoría de sus tecnologías Java bajo la licencia GPL-2.0 únicamente . Oracle ofrece su propia máquina virtual HotSpot Java; sin embargo, la implementación de referencia oficial es OpenJDK JVM, que es un software gratuito de código abierto utilizado por la mayoría de los desarrolladores y es la JVM predeterminada para casi todas las distribuciones de Linux.
En marzo de 2024 [actualizar], Java 22 es la última versión. Java 8, 11, 17 y 21 son versiones LTS anteriores que aún son compatibles oficialmente.
James Gosling , Mike Sheridan y Patrick Naughton iniciaron el proyecto del lenguaje Java en junio de 1991. [21] Java fue diseñado originalmente para la televisión interactiva, pero era demasiado avanzado para la industria de la televisión por cable digital en ese momento. [22] El idioma inicialmente se llamó Oak en honor a un roble que se encontraba afuera de la oficina de Gosling. Posteriormente el proyecto pasó a llamarse Green y finalmente pasó a llamarse Java , de café Java , un tipo de café procedente de Indonesia . [23] Gosling diseñó Java con una sintaxis de estilo C / C++ que los programadores de sistemas y aplicaciones encontrarían familiar. [24]
Sun Microsystems lanzó la primera implementación pública como Java 1.0 en 1996. [25] Prometió la funcionalidad escribir una vez, ejecutar en cualquier lugar (WORA), proporcionando tiempos de ejecución sin costo en plataformas populares . Bastante seguro y con seguridad configurable, permitía restricciones de acceso a la red y a los archivos. Los principales navegadores web pronto incorporaron la capacidad de ejecutar subprogramas de Java dentro de las páginas web, y Java rápidamente se hizo popular. Arthur van Hoff reescribió el compilador Java 1.0 en Java para cumplir estrictamente con la especificación del lenguaje Java 1.0. [26] Con la llegada de Java 2 (lanzado inicialmente como J2SE 1.2 en diciembre de 1998 – 1999), las nuevas versiones tenían múltiples configuraciones creadas para diferentes tipos de plataformas. J2EE incluía tecnologías y API para aplicaciones empresariales que normalmente se ejecutan en entornos de servidor, mientras que J2ME presentaba API optimizadas para aplicaciones móviles. La versión de escritorio pasó a llamarse J2SE. En 2006, con fines de marketing, Sun cambió el nombre de las nuevas versiones J2 a Java EE , Java ME y Java SE , respectivamente.
En 1997, Sun Microsystems se acercó al organismo de estándares ISO/IEC JTC 1 y más tarde a Ecma International para formalizar Java, pero pronto se retiró del proceso. [27] [28] [29] Java sigue siendo un estándar de facto , controlado a través del Proceso de la comunidad Java . [30] Hubo un tiempo en que Sun puso a disposición la mayoría de sus implementaciones de Java sin cargo, a pesar de su estado de software propietario . Sun generó ingresos de Java mediante la venta de licencias para productos especializados como Java Enterprise System.
El 13 de noviembre de 2006, Sun lanzó gran parte de su máquina virtual Java (JVM) como software gratuito y de código abierto (FOSS), bajo los términos de la licencia GPL-2.0 únicamente . El 8 de mayo de 2007, Sun finalizó el proceso, haciendo que todo el código central de su JVM estuviera disponible bajo términos de distribución de software libre /código abierto, aparte de una pequeña porción del código sobre la cual Sun no tenía los derechos de autor. [31]
El vicepresidente de Sun, Rich Green, dijo que el papel ideal de Sun con respecto a Java era el de evangelista . [32] Tras la adquisición de Sun Microsystems por parte de Oracle Corporation en 2009-2010, Oracle se ha descrito a sí mismo como el administrador de la tecnología Java con un compromiso incesante de fomentar una comunidad de participación y transparencia. [33] Esto no impidió que Oracle presentara una demanda contra Google poco después por usar Java dentro del SDK de Android (consulte la sección de Android ).
El 2 de abril de 2010, James Gosling renunció a Oracle . [34]
En enero de 2016, Oracle anunció que los entornos de ejecución de Java basados en JDK 9 descontinuarán el complemento del navegador. [35]
El software Java se ejecuta en todo, desde computadoras portátiles hasta centros de datos , desde consolas de juegos hasta supercomputadoras científicas . [36]
Oracle (y otros) recomiendan encarecidamente desinstalar las versiones obsoletas y no compatibles de Java, debido a problemas de seguridad no resueltos en versiones anteriores. [37]
Había cinco objetivos principales en la creación del lenguaje Java: [17]
- Debe ser simple, orientado a objetos y familiar.
- Debe ser robusto y seguro.
- Debe ser neutral desde el punto de vista arquitectónico y portátil.
- Debe ejecutarse con alto rendimiento.
- Debe ser interpretado , estructurado y dinámico .
A partir de septiembre de 2023 [actualizar], Java 8, 11, 17 y 21 son compatibles como versiones de soporte a largo plazo (LTS). [38]
Oracle lanzó la última actualización pública de costo cero para la versión heredada de Java 8 LTS en enero de 2019 para uso comercial, aunque seguirá admitiendo Java 8 con actualizaciones públicas para uso personal de forma indefinida. Otros proveedores, como Adoptium, continúan ofreciendo versiones gratuitas de las versiones de soporte a largo plazo (LTS) de OpenJDK. Estas compilaciones pueden incluir parches de seguridad adicionales y correcciones de errores. [39]
Principales versiones de lanzamiento de Java, junto con sus fechas de lanzamiento:
Sun ha definido y soporta cuatro ediciones de Java dirigidas a diferentes entornos de aplicaciones y ha segmentado muchas de sus API para que pertenezcan a una de las plataformas. Las plataformas son:
Las clases de las API de Java están organizadas en grupos separados llamados paquetes . Cada paquete contiene un conjunto de interfaces , clases, subpaquetes y excepciones relacionados .
Sun también proporcionó una edición llamada Personal Java que ha sido reemplazada por pares de configuración-perfil Java ME basados en estándares posteriores.
Uno de los objetivos del diseño de Java es la portabilidad , lo que significa que los programas escritos para la plataforma Java deben ejecutarse de manera similar en cualquier combinación de hardware y sistema operativo con soporte de tiempo de ejecución adecuado. Esto se logra compilando el código del lenguaje Java en una representación intermedia llamada código de bytes de Java , en lugar de directamente en el código de máquina específico de la arquitectura . Las instrucciones de código de bytes de Java son análogas al código de máquina, pero están diseñadas para ser ejecutadas por una máquina virtual (VM) escrita específicamente para el hardware host. Los usuarios finales suelen utilizar un Java Runtime Environment (JRE) instalado en su dispositivo para aplicaciones Java independientes o un navegador web para subprogramas Java .
Las bibliotecas estándar proporcionan una forma genérica de acceder a funciones específicas del host, como gráficos, subprocesos y redes .
El uso de código de bytes universal simplifica la portabilidad. Sin embargo, la sobrecarga de interpretar el código de bytes en instrucciones de máquina hizo que los programas interpretados casi siempre se ejecutaran más lentamente que los ejecutables nativos . Los compiladores justo a tiempo (JIT) que compilan códigos de bytes en código de máquina durante el tiempo de ejecución se introdujeron desde una etapa temprana. El compilador Hotspot de Java es en realidad dos compiladores en uno; y con GraalVM (incluido, por ejemplo, en Java 11, pero eliminado a partir de Java 16), que permite la compilación por niveles. [48] Java en sí es independiente de la plataforma y se adapta a la plataforma particular en la que se ejecutará mediante una máquina virtual Java (JVM), que traduce el código de bytes de Java al lenguaje de máquina de la plataforma. [49]
Los programas escritos en Java tienen fama de ser más lentos y requerir más memoria que los escritos en C++ . [50] [51] Sin embargo, la velocidad de ejecución de los programas Java mejoró significativamente con la introducción de la compilación justo a tiempo en 1997/1998 para Java 1.1 , [52] la adición de características del lenguaje que soportan un mejor análisis de código (como clases internas , la clase StringBuilder, afirmaciones opcionales, etc.) y optimizaciones en la máquina virtual Java, como que HotSpot se convirtiera en la JVM predeterminada de Sun en 2000. Con Java 1.5, el rendimiento mejoró con la adición del java.util.concurrent
paquete, incluidas implementaciones sin bloqueos. de ConcurrentMaps y otras colecciones multinúcleo, y se mejoró aún más con Java 1.6.
Algunas plataformas ofrecen soporte de hardware directo para Java; Hay microcontroladores que pueden ejecutar código de bytes de Java en hardware en lugar de una máquina virtual Java de software, [53] y algunos procesadores basados en ARM podrían tener soporte de hardware para ejecutar código de bytes de Java a través de su opción Jazelle , aunque el soporte se ha eliminado en su mayor parte en las implementaciones actuales. de BRAZO.
Java utiliza un recolector de basura automático para administrar la memoria en el ciclo de vida del objeto . El programador determina cuándo se crean los objetos y el tiempo de ejecución de Java es responsable de recuperar la memoria una vez que los objetos ya no están en uso. Una vez que no quedan referencias a un objeto, la memoria inalcanzable pasa a ser elegible para ser liberada automáticamente por el recolector de basura. Algo similar a una pérdida de memoria aún puede ocurrir si el código de un programador contiene una referencia a un objeto que ya no es necesario, generalmente cuando los objetos que ya no son necesarios se almacenan en contenedores que todavía están en uso. [54] Si se llaman métodos para un objeto inexistente, se genera una excepción de puntero nulo . [55] [56]
Una de las ideas detrás del modelo de gestión automática de la memoria de Java es que los programadores pueden ahorrarse la carga de tener que realizar una gestión manual de la memoria. En algunos lenguajes, la memoria para la creación de objetos se asigna implícitamente en la pila o se asigna y desasigna explícitamente del montón . En este último caso, la responsabilidad de gestionar la memoria recae en el programador. Si el programa no desasigna un objeto, se produce una pérdida de memoria . [54] Si el programa intenta acceder o desasignar memoria que ya ha sido desasignada, el resultado no está definido y es difícil de predecir, y es probable que el programa se vuelva inestable o falle. Esto se puede remediar parcialmente mediante el uso de punteros inteligentes , pero añaden gastos generales y complejidad. La recolección de basura no previene las pérdidas de memoria lógica , es decir, aquellas en las que todavía se hace referencia a la memoria pero nunca se usa. [54]
La recolección de basura puede ocurrir en cualquier momento. Idealmente, ocurrirá cuando un programa esté inactivo. Se garantiza que se activará si no hay suficiente memoria libre en el montón para asignar un nuevo objeto; esto puede hacer que un programa se detenga momentáneamente. La gestión explícita de la memoria no es posible en Java.
Java no admite la aritmética de punteros de estilo C/C++ , donde las direcciones de los objetos se pueden manipular aritméticamente (por ejemplo, sumando o restando un desplazamiento). Esto permite que el recolector de basura reubique los objetos referenciados y garantiza la seguridad de los tipos.
Al igual que en C++ y algunos otros lenguajes orientados a objetos, las variables de los tipos de datos primitivos de Java se almacenan directamente en campos (para objetos) o en la pila (para métodos) en lugar de en el montón, como suele ocurrir con los datos no primitivos. tipos (pero ver análisis de escape ). Esta fue una decisión consciente de los diseñadores de Java por razones de rendimiento.
Java contiene varios tipos de recolectores de basura. Desde Java 9, HotSpot utiliza el recolector de basura Garbage First (G1GC) como predeterminado. [57] Sin embargo, también hay varios otros recolectores de basura que se pueden utilizar para administrar el montón. Para la mayoría de las aplicaciones en Java, G1GC es suficiente. Anteriormente, el recolector de basura paralelo se utilizaba en Java 8.
Haber resuelto el problema de gestión de memoria no libera al programador de la carga de manejar adecuadamente otros tipos de recursos, como conexiones de red o de bases de datos, identificadores de archivos, etc., especialmente en presencia de excepciones.
La sintaxis de Java está influenciada en gran medida por C ++ y C. A diferencia de C++, que combina la sintaxis de la programación estructurada, genérica y orientada a objetos, Java se creó casi exclusivamente como un lenguaje orientado a objetos. [17] Todo el código se escribe dentro de clases y cada elemento de datos es un objeto, con la excepción de los tipos de datos primitivos (es decir, enteros, números de punto flotante, valores booleanos y caracteres), que no son objetos por razones de rendimiento. . Java reutiliza algunos aspectos populares de C++ (como el printf
método).
A diferencia de C++, Java no admite la sobrecarga de operadores [58] ni la herencia múltiple para clases, aunque sí se admite la herencia múltiple para interfaces . [59]
Java utiliza comentarios similares a los de C++. Hay tres estilos diferentes de comentarios: un estilo de línea única marcado con dos barras ( //
), un estilo de líneas múltiples abierto /*
y cerrado con */
, y el estilo de comentario Javadoc abierto /**
y cerrado con */
. El estilo de comentario Javadoc permite al usuario ejecutar el ejecutable Javadoc para crear documentación para el programa y puede ser leído por algunos entornos de desarrollo integrados (IDE), como Eclipse, para permitir a los desarrolladores acceder a la documentación dentro del IDE.
Los subprogramas de Java son programas integrados en otras aplicaciones, normalmente en una página web que se muestra en un navegador web. La API del subprograma de Java ahora está en desuso desde Java 9 en 2017. [60] [61]
La tecnología de servlet Java proporciona a los desarrolladores web un mecanismo simple y consistente para ampliar la funcionalidad de un servidor web y acceder a los sistemas comerciales existentes. Los servlets son componentes Java EE del lado del servidor que generan respuestas a las solicitudes de los clientes . La mayoría de las veces, esto significa generar páginas HTML en respuesta a solicitudes HTTP , aunque hay otras clases de servlets estándar disponibles, por ejemplo para la comunicación WebSocket .
La API de servlet de Java ha sido reemplazada hasta cierto punto (pero aún se utiliza internamente) por dos tecnologías Java estándar para servicios web:
Las implementaciones típicas de estas API en servidores de aplicaciones o contenedores de servlets utilizan un servlet estándar para manejar todas las interacciones con las solicitudes y respuestas HTTP que delegan a los métodos del servicio web para la lógica empresarial real.
JavaServer Pages ( JSP ) son componentes Java EE del lado del servidor que generan respuestas, normalmente páginas HTML , a solicitudes HTTP de los clientes . Los JSP incorporan código Java en una página HTML mediante el uso de delimitadores <%
especiales y %>
. Un JSP se compila en un servlet Java , una aplicación Java por derecho propio, la primera vez que se accede a él. Después de eso, el servlet generado crea la respuesta. [62]
Swing es una biblioteca de interfaz gráfica de usuario para la plataforma Java SE. Es posible especificar una apariencia diferente a través del sistema de apariencia y sensación conectable de Swing. Sun proporciona clones de Windows , GTK+ y Motif. Apple también proporciona una apariencia Aqua para macOS . Mientras que las implementaciones anteriores de esta apariencia se consideraban deficientes, Swing en Java SE 6 soluciona este problema mediante el uso de rutinas de dibujo de widgets GUI más nativas de las plataformas subyacentes. [63]
JavaFX es una plataforma de software para crear y entregar aplicaciones de escritorio , así como aplicaciones web enriquecidas que pueden ejecutarse en una amplia variedad de dispositivos. JavaFX está destinado a reemplazar a Swing como la biblioteca GUI estándar para Java SE , pero desde JDK 11 JavaFX no ha estado en el JDK principal sino en un módulo separado. [64] JavaFX es compatible con computadoras de escritorio y navegadores web en Microsoft Windows , Linux y macOS . JavaFX no es compatible con la apariencia y el funcionamiento del sistema operativo nativo. [sesenta y cinco]
En 2004, se agregaron genéricos al lenguaje Java, como parte de J2SE 5.0. Antes de la introducción de los genéricos, cada declaración de variable tenía que ser de un tipo específico. Para las clases de contenedor, por ejemplo, esto es un problema porque no existe una manera fácil de crear un contenedor que acepte sólo tipos específicos de objetos. O el contenedor opera en todos los subtipos de una clase o interfaz, generalmente Object
, o se debe crear una clase contenedora diferente para cada clase contenida. Los genéricos permiten la verificación de tipos en tiempo de compilación sin tener que crear muchas clases contenedoras, cada una de las cuales contiene código casi idéntico. Además de permitir un código más eficiente, se evita que se produzcan ciertas excepciones en tiempo de ejecución mediante la emisión de errores en tiempo de compilación. Si Java evitara que ClassCastException
se produjeran todos los errores de tipo en tiempo de ejecución, sería seguro para tipos .
En 2016, se demostró que el sistema de tipos de Java era incorrecto, ya que es posible usar genéricos para construir clases y métodos que permiten la asignación de una instancia de una clase a una variable de otra clase no relacionada. El compilador acepta dicho código, pero falla en tiempo de ejecución con una excepción de conversión de clase. [66]
Las críticas dirigidas a Java incluyen la implementación de genéricos, [67] velocidad, [50] el manejo de números sin signo, [68] la implementación de aritmética de punto flotante, [69] y un historial de vulnerabilidades de seguridad en la implementación principal de Java VM Punto de acceso . [70]
La biblioteca de clases de Java es la biblioteca estándar , desarrollada para respaldar el desarrollo de aplicaciones en Java. Está controlado por Oracle en cooperación con otros a través del programa Java Community Process . [71] Las empresas o individuos que participan en este proceso pueden influir en el diseño y desarrollo de las API. Este proceso ha sido objeto de controversia durante la década de 2010. [72] La biblioteca de clases contiene características tales como:
Javadoc es un sistema de documentación integral, creado por Sun Microsystems . Proporciona a los desarrolladores un sistema organizado para documentar su código. Los comentarios de Javadoc tienen un asterisco adicional al principio, es decir, los delimitadores son /**
y */
, mientras que los comentarios normales de varias líneas en Java están delimitados por /*
y */
y los comentarios de una sola línea comienzan con //
. [80]
Oracle Corporation posee la implementación oficial de la plataforma Java SE, debido a la adquisición de Sun Microsystems el 27 de enero de 2010. Esta implementación se basa en la implementación original de Java de Sun. La implementación de Oracle está disponible para Windows , macOS , Linux y Solaris . Debido a que Java carece de cualquier estandarización formal reconocida por Ecma International , ISO/IEC, ANSI u otras organizaciones de estándares de terceros, la implementación de Oracle es el estándar de facto .
La implementación de Oracle está empaquetada en dos distribuciones diferentes: Java Runtime Environment (JRE), que contiene las partes de la plataforma Java SE necesarias para ejecutar programas Java y está destinado a usuarios finales, y Java Development Kit (JDK), que está destinado a para desarrolladores de software e incluye herramientas de desarrollo como el compilador Java , Javadoc , Jar y un depurador . Oracle también lanzó GraalVM , un compilador e intérprete dinámico de Java de alto rendimiento.
OpenJDK es otra implementación de Java SE con licencia GNU GPL. La implementación comenzó cuando Sun comenzó a publicar el código fuente de Java bajo la GPL. A partir de Java SE 7, OpenJDK es la implementación oficial de referencia de Java.
El objetivo de Java es hacer compatibles todas las implementaciones de Java. Históricamente, la licencia de marca registrada de Sun para el uso de la marca Java insiste en que todas las implementaciones sean compatibles . Esto resultó en una disputa legal con Microsoft después de que Sun afirmara que la implementación de Microsoft no admitía la invocación de método remoto de Java (RMI) o la interfaz nativa de Java (JNI) y había agregado características propias específicas de la plataforma. Sun presentó una demanda en 1997 y, en 2001, ganó un acuerdo de 20 millones de dólares, así como una orden judicial que hacía cumplir los términos de la licencia de Sun. [81] Como resultado, Microsoft ya no incluye Java con Windows .
Java independiente de la plataforma es esencial para Java EE y se requiere una validación aún más rigurosa para certificar una implementación. Este entorno permite aplicaciones portátiles del lado del servidor.
El lenguaje de programación Java requiere la presencia de una plataforma de software para poder ejecutar los programas compilados.
Oracle proporciona la plataforma Java para su uso con Java. El SDK de Android es una plataforma de software alternativa, utilizada principalmente para desarrollar aplicaciones de Android con su propio sistema GUI.
El lenguaje Java es un pilar clave de Android , un sistema operativo móvil de código abierto . Aunque Android, construido sobre el kernel de Linux , está escrito en gran medida en C, el SDK de Android utiliza el lenguaje Java como base para las aplicaciones de Android, pero no utiliza ninguno de sus GUI estándar, SE, ME u otros estándares Java establecidos. [82] El lenguaje de código de bytes admitido por el SDK de Android es incompatible con el código de bytes de Java y se ejecuta en su propia máquina virtual, optimizada para dispositivos con poca memoria, como teléfonos inteligentes y tabletas . Dependiendo de la versión de Android, el código de bytes es interpretado por la máquina virtual Dalvik o compilado en código nativo por Android Runtime .
Android no proporciona la biblioteca estándar Java SE completa, aunque el SDK de Android incluye una implementación independiente de un gran subconjunto de la misma. Es compatible con Java 6 y algunas funciones de Java 7, ofreciendo una implementación compatible con la biblioteca estándar ( Apache Harmony ).
El uso de tecnología relacionada con Java en Android provocó una disputa legal entre Oracle y Google. El 7 de mayo de 2012, un jurado de San Francisco determinó que si las API podían tener derechos de autor, entonces Google había infringido los derechos de autor de Oracle al utilizar Java en dispositivos Android. [83] El juez de distrito William Alsup dictaminó el 31 de mayo de 2012 que las API no pueden tener derechos de autor, [84] pero esto fue revocado por el Tribunal de Apelaciones del Circuito Federal de los Estados Unidos en mayo de 2014. [85] El 26 de mayo de 2016 , el tribunal de distrito falló a favor de Google y dictaminó que la infracción de derechos de autor de la API de Java en Android constituye un uso legítimo. [86] En marzo de 2018, este fallo fue revocado por el Tribunal de Apelaciones, que remitió el caso para determinar los daños y perjuicios al tribunal federal de San Francisco. [87] Google presentó una petición de auto de certiorari ante la Corte Suprema de los Estados Unidos en enero de 2019 para impugnar las dos sentencias que fueron dictadas por la Corte de Apelaciones a favor de Oracle. [88] El 5 de abril de 2021, el Tribunal falló 6-2 a favor de Google, que su uso de las API de Java debe considerarse uso legítimo . Sin embargo, el tribunal se negó a pronunciarse sobre la protección de los derechos de autor de las API y, en cambio, optó por determinar su decisión considerando que la API de Java tiene derechos de autor "puramente por razones de argumento". [89]
El proyecto siguió adelante con el nombre
verde
y el lenguaje se basó en un modelo antiguo de
UCSD Pascal
, que permite generar código interpretativo.
En el verano de 1996, Sun estaba diseñando el precursor de lo que ahora es el modelo de eventos de AWT y la arquitectura de componentes JavaBeans. Borland contribuyó en gran medida a este proceso. Observamos muy detenidamente Delphi Object Pascal y construimos un prototipo funcional de referencias de métodos vinculados para comprender su interacción con el lenguaje de programación Java y sus API.
Oracle ha sido un partidario líder y sustancial de Java desde su aparición en 1995 y asume el nuevo papel como administrador de la tecnología Java con un compromiso incesante de fomentar una comunidad de participación y transparencia.
Francamente, no entiendo por qué Google pretende ignorar la gran cantidad de implementaciones existentes. Me parece un mal caso de “aquí no se inventó”. En última instancia, esto ralentizará la adopción. Ya existen demasiadas plataformas Java para el mundo móvil y esta es otra más