JavaRush /Blog Java /Random-ES /Nuevo Java... Otra vez... Conozca Java 10

Nuevo Java... Otra vez... Conozca Java 10

Publicado en el grupo Random-ES
Anteriormente, los desarrolladores esperaron un nuevo Java durante varios años, algunos con horror y otros con esperanza. Los tiempos han cambiado y cada seis meses nos deleitarán nuevas versiones del JDK. Si aún no tienes claro a qué te llevará esto, consulta la opinión del experto , y aquí te enumeraremos los principales cambios en Java 10, la versión más nueva de nuestro lenguaje favorito. Nuevo Java... Otra vez... Conozca Java 10 - 1Entre corchetes antes de la nueva “característica” se indica el número JEP, es decir, “Propuesta de mejora JDK”. JEP es una propuesta para mejorar OpenJDK y puede aprobarse, retrasarse o rechazarse. Es decir, en esencia, una colección de JEP es una estrategia de desarrollo para OpenJDK.

Características importantes de Java 10

[286] Inferencia de tipo de variable local : una propuesta para introducir la palabra clave var en Java, eliminando la necesidad de especificar explícitamente el tipo de una variable local. Es decir, ahora no puedes especificar el tipo de variable inicializada, sino escribir algo como:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Esto elimina la duplicación de la definición de tipo ArrayList<String> que hubiéramos tenido que usar antes. Es interesante observar que var no se convierte en una palabra clave, sino que es un tipo reservado. Es decir, puede utilizar var como nombre de una variable, método o paquete. Pero no podrás nombrar la clase de esa manera (¡qué pérdida!). [296] Fusionar el bosque JDK en un único repositorio . JDK 9 tiene ocho repositorios: root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. En Java 10, todo este bosque se combinará en un único repositorio para hacer posible realizar confirmaciones atómicas entre repositorios de conjuntos de cambios interdependientes. [304] La interfaz Garbage-Collector no es una interfaz que los desarrolladores puedan utilizar para controlar la recolección de basura. En su lugar, obtenemos una interfaz limpia del recolector de basura en el código fuente de JVM, lo que le permite integrar recolectores alternativos rápida y fácilmente. Aquellos que soñaron con agregar su propio recolector de basura a la JVM estarán muy satisfechos con esta mejora. [307] GC completo paralelo para el recolector de basura G1 . En JDK 9, G1 se convirtió en el recolector de basura predeterminado, mientras que anteriormente el recolector de basura predeterminado era Parallel GC, que podía recolectar basura en múltiples subprocesos. Ahora G1 también puede hacer esto; antes lo hacía en un hilo, lo que a veces causaba dificultades. Por cierto, los desarrolladores podrán configurar la cantidad de subprocesos utilizando el parámetro XX:ParallelGCThreads. [310] Uso compartido de datos de clase de aplicación : este desarrollo, adoptado en Java 10, ofrece carga y seguimiento mejorados y amplía la función de uso compartido de clases (CDS) existente. para permitir que las clases de aplicaciones se ubiquen en el archivo general. Class-Data Sharing o CDS para trabajos cortos con archivos con la extensión *class. Esta función le permite seleccionar un determinado subconjunto de clases, procesarlas y comprimirlas en un archivo especial. Todo esto se hace para ahorrar memoria. A menudo, diferentes instancias de JVM cargan las mismas clases incluidas en la biblioteca estándar. Y CDS permite que todas estas instancias de JVM compartan un único archivo con las clases ubicadas en él. Esto reduce tanto el tiempo de carga del programa como el uso de memoria. De hecho, CDS mejora el rendimiento de inicio de JVM y reduce el uso de recursos cuando se ejecutan varias JVM en la misma máquina física o virtual, a partir de la versión 5. Pero antes el uso de CDS se limitaba únicamente al cargador de arranque. Ahora una versión extendida llamada Application CDS le permite cargar archivos especiales con clases para otros cargadores. [312] Los apretones de manos locales de subprocesos son un cambio de nivel bastante bajo dentro de la JVM que permitirá que las devoluciones de llamadas se ejecuten entre subprocesos sin ejecutar un punto de seguridad global de la VM. Esto le permitirá detener subprocesos individuales sin coste alguno, en lugar de detenerlos todos a la vez (o ninguno). [313] Eliminar la herramienta de generación de encabezados nativos (javah) . En Java 9, los desarrolladores de lenguajes comenzaron a eliminar activamente herramientas innecesarias y JEP 313 continúa con este buen trabajo. La herramienta javah genera encabezados JNI si hay métodos nativos en el código. ¿Saludable? Por supuesto, pero el compilador javac nativo, a partir de JDK 8, puede generar encabezados JNI. Entonces ahora decidieron deshacerse de javah. Por cierto, actualmente se está desarrollando el proyecto Panamá , que, en particular, puede reemplazar a JNI. [314] Extensiones adicionales de etiquetas de idioma Unicode Este cambio tiene como objetivo mejorar la clase java.util.Locale y las API asociadas para implementar extensiones Unicode adicionales a las etiquetas de idioma BCP 47. En particular, etiquetas para el tipo de moneda (cu), día uno Ahora se admitirán anulaciones de semana (fw), región (rg) y zona horaria (tz). [316] Asignación de montón en dispositivos de memoria alternativos Esta innovación ayudará a quienes utilizan tipos de memoria distintos de DRAM. Dado que las tecnologías cambian constantemente, el uso de memoria no volátil con la misma interfaz y características de rendimiento similares a la DRAM es una realidad objetiva hoy en día. Entonces, JEP 316 permite que la JVM coloque un montón en otros tipos de memoria. [317] Compilador JIT experimental basado en Java . Recientemente se anunció el proyecto Metropolis, que propone reescribir la mayor parte de la JVM en Java. En caso de que no lo sepas, la versión actual está escrita en C++. Bueno, si ya lo sabes, probablemente al principio esa idea te parezca extraña. Dado que la JVM está escrita en Java, ¿no necesitaría una JVM para ejecutarla? Esta es la recursión, que recuerda a los espejos uno frente al otro. Sin embargo, la realidad es un poco diferente: sólo porque la JVM esté escrita en Java, eso no significa que tengas que compilarla en códigos de bytes. De hecho, puede usar la compilación AOT y luego JIT compila el código mientras funciona para mejorar el rendimiento.

Una herramienta como javac se usa comúnmente para compilar código Java. Convierte un programa Java en un conjunto de archivos de clase con códigos de bytes. A continuación, la JVM ejecuta su código de bytes y su intérprete los convierte en instrucciones del procesador. Además del intérprete, la JVM también tiene un compilador incorporado y también puede crear instrucciones para el procesador a partir de código de bytes. Esta es la llamada compilación en tiempo de ejecución, compilación durante el inicio. Por lo general, el código que se utiliza con más frecuencia está sujeto a dicha compilación; esto mejora el rendimiento.

El compilador puede realizar acciones de diferentes maneras: compilación JIT (justo a tiempo), dinámica, justo durante la ejecución del programa, o compilación AOT (antes de tiempo), antes de la ejecución.

El compilador jaotc AOT se introdujo en JDK 9. Actualmente, Hotspot JVM contiene dos compiladores JIT, C1 (para velocidad) y C2 (para optimización).

JEP 317 presenta el proyecto de investigación Graal, un compilador para el JDK. Esta es una base segura que ayudará a hacer de Metropolis una realidad y permitirá que la JVM iguale (o mejor aún, supere) la versión actual escrita en C++ en rendimiento. [319] Los certificados raíz son el conjunto predeterminado de certificados de autoridad de certificación (CA) estándar en el JDK. Los componentes de seguridad críticos, como TLS, ahora funcionarán de forma predeterminada en las compilaciones de OpenJDK. Esta útil adición probablemente sea parte de lo que Oracle está haciendo para garantizar que los binarios de OpenJDK y los binarios de Oracle JDK sean funcionalmente iguales. [322] Versiones de lanzamiento basadas en el tiempo : en Java 10, se agregarán nuevas funciones a las versiones de funciones y se corregirán errores en las versiones de actualización. Básicamente, tenemos una nueva forma de configurar los formatos de cadena de la versión JDK. Soluciona una situación bastante extraña con JDK 9. La primera actualización fue JDK 9.0.1, lo cual es bastante lógico. La segunda actualización es JDK 9.0.4, lo cual es ilógico. La lógica es que dentro del esquema de numeración de versiones de JDK 9, se deja espacio entre las actualizaciones en caso de una actualización de emergencia no planificada. Dado que la actualización no fue necesaria, ¿por qué no llamarlo simplemente JDK 9.0.2? Y así es como se ve el formato de la nueva versión de Java:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

Nuevas API

Hay 73 adiciones a las bibliotecas de clases estándar JDK 10.
  • java.awt.kit de herramientas

    int getMenuShortcutKeyMaskEx (): Define qué tecla modificadora extendida es la tecla aceleradora correspondiente para el menú contextual.

  • java.awt.geom.Path2D:

    void trimToSize (): recorta la capacidad de esta instancia Path2Da su tamaño actual. Una aplicación puede utilizar esta operación para minimizar el almacenamiento de rutas. El mismo método se ha agregado a las clases internas Path2D.Doubley Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): sobrecargado toString, convierte el contenido de un búfer en una cadena decodificando los bytes usando la codificación especificada.

  • java.io.PrintStream y lang.io.PrintWriter:

    Ambas clases tienen tres nuevos constructores que toman un argumento adicional charset.

  • java.io.Reader:

    long transferTo (Writer): Lee todos los caracteres de este lector y escribe los caracteres al escritor determinado en el orden en que se leen.

  • java.lang.Runtime.Versión:

    Cuatro nuevos métodos que devuelven un valor entero para la nueva versión (JEP 322) de los campos de cadena : feature (), y .interim ()patch ()update ()

  • java.lang.StackWalker.StackFrame:

  • Cadena getDescriptor():

    devuelve un identificador al método representado por este marco de pila, según lo definido por la Especificación de la máquina virtual Java.

  • Cadena getMethodType():

    return MethodType, que representa los tipos de parámetros y el tipo de retorno del método representado por el marco de pila.

  • java.lang.invoke.MethodType:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, en lugar de него возвращается significado sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid () возвращает pid запущенной виртуальной машины Java.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int): возвращает информацию о потоке для всех потоков в реальном времени с трассировкой стека с указанным максимальным количеством элементов и информацией о синхронизации.

  • ThreadInfo [] getThreadInfo (long [], boolean, boolean, int):

    возвращает информацию о потоке для каждого потока, чья идентификация находится во входном массиве, с трассировкой стека указанного максимального количества элементов и информацией о синхронизации.

  • java.lang.reflect.MalformedParameterizedTypeException:

    добавлен новый конструктор, который принимает подробное сообщение в виде строки в качестве параметра.

  • java.net.URLDecoder и java.net.URLEncoder:

    оба этих класса получo новые перегруженные методы расcódigoирования и códigoирования, которые используют charset в качестве дополнительного параметра.

  • java.nio.channels.Channels:

    Два новых статических перегруженных метода, newReader (ReadByteChannel, Charset) и newWriter (WriteByteChannel, Charset), которые позволяют использовать charset.

  • java.nio.file.FileStore:

    long getBlockSize (): возвращает количество byteов на блок в этом хранoще файлов.

  • java.time.chrono:

    три класса в этом пакете, HijrahEra, MiinguoEra и ThaiBuddhistEra, получo метод String getDisplayName (TextStyle, Locale). Он возвращает текстовое Nombre, используемое для идентификации эпохи, подходящее для представления пользователю.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): возвращает копию этого форматтера с локализованными значениями языка, календаря, региона, десятичного стиля и / o часового пояса, которые заменяют значения в этом формате.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatistics и LongSummaryStatistics получo новый конструктор, который принимает четыре числовых значения. Он создает непустой экземпляр с указанным счетчиком, минимумом, максимумом и суммой.

  • java.util.List, java.util.Map и java.util.Set:

    каждый из этих интерфейсов обзавёлся новым статическим методом copyOf (Collection). Они возвращают неизменяемые List, Map o Set, содержащие элементы данной коллекции, в своем порядке итерации.

  • java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong:

    каждый из этих классов получает новый метод orElseThrow (), который по существу делает то же самое, что и get (), то есть если condición выполняется, significado возвращается. В противном случае генерируется исключение NoSuchElementException.

  • java.util.Formatter и java.util.Scanner:

    Оба этих класса получo три новых конструктора, которые на вход получают charset в дополнение к другим аргументам.

  • java.util.Properties:

    Здесь появился новый конструктор, который принимает аргумент int. Это создает пустой список свойств без значений по умолчанию и с начальным размером, содержащим указанное количество элементов без необходимости динамического изменения размера. Также появилась новая, перегруженная versión метода replace, которая принимает три параметра Object и возвращает логическое significado.

  • java.SplittableRandom:

    void nextBytes (byte []): заполняет предоставленный пользователем массив byteов с генерируемыми псевдослучайными byteами.

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) o «Not completed» (не завершено).

  • java.util.concurrent.locks.StampedLock:

    новые методы boolean isLockStamp (long), boolean isOptimisticReadStamp (long), boolean isReadLockStamp (long) и boolean isWriteLockStamp (long).

  • java.jar.JarEntry:

    String getRealName (): возвращает настоящее Nombre этого JarEntry. Если JarEntry является записью мультирелизного jar-archivo, настроенного для обработки, тогда Nombre, возвращаемое этим методом — Nombre пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Nombre, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

    Stream <JarEntry> versionedStream (): возвращает поток записей в файле с версией jar. Подобно методу getRealName для JarEntry, связан с мультирелизными jar-archivoми.

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Nombre для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Nombre для данного Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator) — эти четыре новых метода возвращают коллекторы (Collectors), которые накапливают входные элементы в соответствующую немодифицируемую коллекцию.

  • java.lang.model.SourceVersion:

    теперь это поле RELEASE_10 для представления версии JDK 10.

  • java.lang.model.util.TypeKindVisitor6 и javax.lang.model.util.TypeKindVisitor9:

    что-то не вполне понятное:).

  • R visitNoTypeAsModule (NoType, P):

    посещает псевдо-тип MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    У этого класса было добавлено два поля: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Представляете, Swing все еще обновляется!

  • ButtonGroup getGroup ():

    возвращает группу, к которой принадлежит кнопка. Обычно используется с radio buttons, которые являются взаимоисключающими в своей группе.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION