JavaRush /Blogue Java /Random-PT /Novo Java... de novo... Conheça o Java 10

Novo Java... de novo... Conheça o Java 10

Publicado no grupo Random-PT
Anteriormente, os desenvolvedores esperavam por um novo Java há vários anos, alguns com horror e outros com esperança. Os tempos mudaram e novas versões do JDK nos farão deliciar a cada seis meses. Se ainda não está claro para você o que isso vai levar, confira a opinião do especialista , e aqui listaremos as principais mudanças no Java 10, a mais nova versão da nossa linguagem favorita. Novo Java... De novo... Conheça o Java 10 - 1Entre colchetes antes do novo “recurso” é indicado o número do JEP, ou seja, “Proposta de Aprimoramento JDK”. JEP é uma proposta para melhorar o OpenJDK e pode ser aprovada, adiada ou rejeitada. Isto é, em essência, uma coleção de JEPs é uma estratégia de desenvolvimento para OpenJDK.

Recursos importantes do Java 10

[286] Inferência de tipo de variável local - Uma proposta para introduzir a palavra-chave var em Java, eliminando a necessidade de especificar explicitamente o tipo de uma variável local. Ou seja, agora você não pode especificar o tipo da variável inicializada, mas escrever algo como:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Isso elimina a duplicação da definição do tipo ArrayList<String> que teríamos que usar antes. É interessante notar que var não se torna uma palavra-chave, mas é um tipo reservado. Ou seja, você pode usar var como o nome de uma variável, método ou pacote. Mas você não conseguirá nomear a classe dessa forma (que perda!). [296] Mesclando a floresta JDK em um único repositório . O JDK 9 possui oito repositórios - root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. No Java 10, toda essa floresta será combinada em um único repositório para possibilitar a execução de commits atômicos em repositórios de conjuntos de alterações interdependentes. [304] A interface Garbage-Collector não é uma interface que pode ser usada por desenvolvedores para controlar a coleta de lixo. Em vez disso, obtemos uma interface de coletor de lixo limpa no código-fonte da JVM, permitindo integrar coletores alternativos de maneira rápida e fácil. Aqueles que sonhavam em adicionar seu próprio coletor de lixo à JVM ficarão muito satisfeitos com esta melhoria. [307] GC completo paralelo para o coletor de lixo G1 . No JDK 9, G1 se tornou o coletor de lixo padrão, enquanto anteriormente o coletor de lixo padrão era o Parallel GC, que podia coletar lixo em vários threads. Agora o G1 também pode fazer isso, antes fazia isso em uma só thread, o que às vezes causava dificuldades. A propósito, os desenvolvedores poderão configurar o número de threads usando o parâmetro - XX:ParallelGCThreads. [310] Application Class-Data Sharing - este desenvolvimento, adotado no Java 10, oferece carregamento e rastreamento aprimorados, estende o recurso existente de Class Sharing (CDS) para permitir que as classes de aplicativos sejam localizadas no arquivo geral. Class-Data Sharing ou CDS, abreviadamente, funciona com arquivos com a extensão *class. Esta função permite selecionar um determinado subconjunto de classes, processá-las e compactá-las em um arquivo especial. Tudo isso é feito para economizar memória. Freqüentemente, diferentes instâncias da JVM carregam as mesmas classes incluídas na biblioteca padrão. E o CDS permite que todas essas instâncias JVM compartilhem um único arquivo com classes colocadas nele. Isso reduz o tempo de carregamento do programa e o uso de memória. Na verdade, o CDS melhora o desempenho de inicialização da JVM e reduz o consumo de recursos quando várias JVMs estão em execução na mesma máquina física ou virtual, começando com a versão 5. Mas anteriormente o uso do CDS era limitado apenas ao carregador de bootstrap. Agora, uma versão estendida chamada Application CDS permite carregar arquivos especiais com classes para outros carregadores. [312] Thread-Local Handshakes é uma mudança de nível bastante baixo dentro da JVM que permitirá que retornos de chamada sejam executados entre threads sem executar um ponto de segurança global da VM. Isso permitirá que você interrompa threads individuais sem custos, em vez de interromper todos de uma vez (ou nenhum). [313] Remova a ferramenta de geração de cabeçalho nativo (javah) . No Java 9, os desenvolvedores de linguagens começaram a remover ativamente ferramentas desnecessárias, e o JEP 313 dá continuidade a esse bom trabalho. A ferramenta javah gera cabeçalhos JNI se houver métodos nativos no código. Saudável? Claro, mas o compilador javac nativo, começando com JDK 8, pode gerar cabeçalhos JNI. Então agora eles decidiram se livrar do javah. A propósito, está sendo desenvolvido o projeto Panamá , que, em particular, pode substituir o JNI. [314] Extensões adicionais de tags de idioma Unicode Esta alteração tem como objetivo melhorar a classe java.util.Locale e APIs associadas para implementar extensões Unicode adicionais para tags de idioma BCP 47. Em particular, tags para o tipo de moeda (cu), primeiro dia agora serão suportadas substituições de semana (fw), região (rg) e fuso horário (tz). [316] Alocação de heap em dispositivos de memória alternativos Esta inovação ajudará aqueles que usam tipos de memória diferentes de DRAM. Como as tecnologias estão em constante mudança, o uso de memória não volátil com a mesma interface e características de desempenho semelhantes às DRAM é uma realidade objetiva hoje. Portanto, o JEP 316 permite que a JVM coloque um heap em outros tipos de memória. [317] Compilador JIT experimental baseado em Java . Foi anunciado recentemente o projeto Metropolis, que propõe reescrever a maior parte da JVM em Java. Caso você não saiba, a versão atual está escrita em C++. Bem, se você já sabe, provavelmente a princípio tal ideia lhe parecerá estranha. Como a JVM é escrita em Java, você não precisaria de uma JVM para executá-la? Tal é a recursão, que lembra espelhos opostos um ao outro. Porém, a realidade é um pouco diferente: só porque a JVM é escrita em Java, isso não significa que você precise compilá-la em bytecodes. Na verdade, você pode usar a compilação AOT e, em seguida, o JIT compila o código enquanto trabalha para melhorar o desempenho.

Uma ferramenta como javac é comumente usada para compilar código Java. Ele converte um programa Java em um conjunto de arquivos de classe com bytecodes. Em seguida, a JVM executa seu bytecode e seu intérprete os converte em instruções do processador. Além do intérprete, a JVM também possui um compilador integrado, podendo também criar instruções para o processador a partir do bytecode. Esta é a chamada compilação em tempo de execução, compilação durante a inicialização. Normalmente, o código usado com mais frequência é submetido a essa compilação - isso melhora o desempenho.

O compilador pode executar ações de diferentes maneiras: compilação JIT (just-in-time) - dinâmica, logo durante a execução do programa, ou compilação AOT (ahead-of-time) - antes da execução.

O compilador jaotc AOT foi introduzido no JDK 9. Atualmente, o Hotspot JVM contém dois compiladores JIT, C1 (para velocidade) e C2 (para otimização).

O JEP 317 apresenta o projeto de pesquisa Graal, um compilador para o JDK. Esta é uma base certa que ajudará a tornar Metropolis uma realidade e permitirá que a JVM corresponda (ou melhor ainda, exceda) a versão atual escrita em C++ em desempenho. [319] Certificados raiz são o conjunto padrão de certificados de Autoridade de Certificação (CA) padrão no JDK. Componentes críticos de segurança, como TLS, agora funcionarão por padrão em compilações OpenJDK. Essa adição útil provavelmente faz parte do que a Oracle está fazendo para garantir que os binários OpenJDK e os binários Oracle JDK sejam funcionalmente iguais. [322] Versionamento de lançamento baseado em tempo - no Java 10, novos recursos serão adicionados aos lançamentos de recursos e bugs serão corrigidos em lançamentos de atualização. Essencialmente, temos uma nova maneira de definir formatos de string de versão do JDK. Ele corrige uma situação bastante estranha com o JDK 9. A primeira atualização foi o JDK 9.0.1, o que é bastante lógico. A segunda atualização é o JDK 9.0.4, o que é ilógico. A lógica é que dentro do esquema de numeração de versão do JDK 9, é deixado espaço entre as atualizações no caso de uma atualização emergencial e não planejada. Já que a atualização não era necessária, por que não chamá-la de JDK 9.0.2? E aqui está a aparência do novo formato da versão Java:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

Novas APIs

Existem 73 adições às bibliotecas de classes padrão do JDK 10.
  • java.awt.Toolkit

    int getMenuShortcutKeyMaskEx (): Define qual tecla modificadora estendida é a tecla aceleradora correspondente para o menu de atalho.

  • java.awt.geom.Path2D:

    void trimToSize (): reduz a capacidade desta instância Path2Dpara seu tamanho atual. Um aplicativo pode usar esta operação para minimizar o armazenamento de caminho. O mesmo método foi adicionado às classes internas Path2D.Doublee Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): sobrecarregado toString, converte o conteúdo de um buffer em uma string decodificando os bytes usando a codificação especificada.

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

    Ambas as classes possuem três novos construtores que recebem um argumento adicional charset.

  • java.io.Leitor:

    long transferTo (Writer): Lê todos os caracteres deste leitor e grava os caracteres para o escritor determinado na ordem em que são lidos.

  • java.lang.Runtime.Version:

    Quatro novos métodos que retornam um valor inteiro para a nova versão (JEP 322) de campos de string : feature (), e .interim ()patch ()update ()

  • java.lang.StackWalker.StackFrame:

  • String getDescriptor():

    retorna um identificador para o método representado por esse quadro de pilha, conforme definido pela Java Virtual Machine Specification.

  • String getMethodType():

    retorna MethodType, representando os tipos de parâmetro e o tipo de retorno do método representado pelo quadro de pilha.

  • java.lang.invoke.MethodType:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, instead of него возвращается meaning 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:

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

  • java.nio.channels.Channels:

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

  • java.nio.file.FileStore:

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

  • java.time.chrono:

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

  • java.time.format.DateTimeFormatter:

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

  • java.util:

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

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

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

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

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

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

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

  • java.util.Properties:

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

  • java.SplittableRandom:

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

  • java.util.concurrent.FutureTask:

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

  • java.util.concurrent.locks.StampedLock:

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

  • java.jar.JarEntry:

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

  • java.util.jar.JarFile:

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

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Name для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Name для данного 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): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION