tag:blogger.com,1999:blog-64482801823892264962024-03-17T10:13:07.502-03:00Guia do JavaBlog sobre a plataforma Java e assuntos relacionadosSandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.comBlogger58125tag:blogger.com,1999:blog-6448280182389226496.post-17424695939060394452024-03-17T10:12:00.002-03:002024-03-17T10:12:20.768-03:00Java 22<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Java 22" name="twitter:title"></meta>
<meta content="Java 22 vem aí!" name="twitter:description"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://blogger.googleusercontent.com/img/a/AVvXsEiZp2Z1sK_-XGu9wdhJegp21d_BEzdy63bTWflKoPqdAg_fx3Zdh-E77urkHjiylv4a9wBmj2L_VahR5SLQzVyLWKHQUmtS04MKRw4g_fV8Z4puitT1WIZJlivza9yYqmpVz_Y5meSY9AYHuy3jKlqhHWfUvtSs3rgUVdMh2iNvDpO_Q-asIzhfU5JX1Rwc" name="twitter:image"></meta>
<div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiZp2Z1sK_-XGu9wdhJegp21d_BEzdy63bTWflKoPqdAg_fx3Zdh-E77urkHjiylv4a9wBmj2L_VahR5SLQzVyLWKHQUmtS04MKRw4g_fV8Z4puitT1WIZJlivza9yYqmpVz_Y5meSY9AYHuy3jKlqhHWfUvtSs3rgUVdMh2iNvDpO_Q-asIzhfU5JX1Rwc" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="960" data-original-width="1920" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEiZp2Z1sK_-XGu9wdhJegp21d_BEzdy63bTWflKoPqdAg_fx3Zdh-E77urkHjiylv4a9wBmj2L_VahR5SLQzVyLWKHQUmtS04MKRw4g_fV8Z4puitT1WIZJlivza9yYqmpVz_Y5meSY9AYHuy3jKlqhHWfUvtSs3rgUVdMh2iNvDpO_Q-asIzhfU5JX1Rwc=w640-h320" width="640" /></a></div><div><br /></div><h1 style="text-align: justify;">Java 22 vem aí!</h1></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">O JDK 22 está chegando, sendo lançado em 19 de março. Podemos acompanhar a live de lançamento aqui <a href="https://www.youtube.com/watch?v=AjjAZsnRXtE" target="_blank">https://www.youtube.com/watch?v=AjjAZsnRXtE</a> a partir das 14 horas (horário de Brasilia)</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">No total, são 12 features (JEPs) a serem liberadas no JDK 22. Classificadas em final features e preview features. 4 final features, 7 preview features e 1 feature incubada. Além de inúmeros bugs corrigidos e pequenas outras novas features. O release notes pode ser acessado <a href="https://jdk.java.net/22/release-notes" target="_blank">aqui</a>.</div><div><h3 style="text-align: justify;"><br />Final Features</h3><div><div style="text-align: left;"><div style="text-align: justify;"><a href="https://openjdk.org/jeps/423" target="_blank"><b>423:</b><span style="font-weight: bold; white-space: pre;"> </span></a><b><a href="https://openjdk.org/jeps/423" target="_blank">Region Pinning for G1</a></b></div><div style="text-align: justify;"><span style="font-weight: 700;"><br /></span></div><div style="text-align: justify;">Reduzir a latência implementando a fixação de região no G1, para que a coleta de lixo não precise ser desativada durante regiões críticas da Java Native Interface (JNI). Aborda problemas de travamento de threads porque foram referenciados por objetos usados pelo código nativo. Com esta alteração, o G1 manterá os objetos nativos na região onde residem enquanto continua a executar o coletor de lixo.</div></div><div style="text-align: justify;"><br /></div><div><div><b><div style="text-align: justify;"><b><a href="https://openjdk.org/jeps/454" target="_blank">454:<span style="white-space: pre;"> </span>Foreign Function & Memory API</a></b></div></b></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Uma API que permite que programas Java chamem bibliotecas nativas e processem dados nativos sem a fragilidade e o perigo de JNI. Atualmente, os desenvolvedores Java ainda enfrentam obstáculos significativos no acesso a um tipo importante de recurso não-Java: código e dados na mesma máquina que a JVM, mas fora da JVM.</div></div><div><br /></div><div><div><a href="https://openjdk.org/projects/jdk/22/" target="_blank"><b>456:<span style="white-space: pre;"> </span>Unnamed Variables & Patterns</b></a></div><div><br /></div><div style="text-align: justify;">Melhorar a linguagem de programação Java com variáveis e padrões sem nome, que podem ser usados quando declarações de variáveis ou padrões aninhados são necessários, mas nunca usados. Ambos são indicados pelo caractere de sublinhado, _. Um exemplo de uso de variáveis sem nome:</div><div><br /><span style="font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Luxi Mono", "Courier New", monospace;"><span style="font-size: medium;">static int count(Iterable<Order> orders) {</span></span></div><div><span style="font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Luxi Mono", "Courier New", monospace;"><span style="font-size: medium;"> int total = 0;</span></span></div><div><span style="font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Luxi Mono", "Courier New", monospace;"><span style="font-size: medium;"> for (Order _ : orders) // Unnamed variable</span></span></div><div><span style="font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Luxi Mono", "Courier New", monospace;"><span style="font-size: medium;"> total++;</span></span></div><div><span style="font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Luxi Mono", "Courier New", monospace;"><span style="font-size: medium;"> return total;</span></span></div><div><span style="font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Luxi Mono", "Courier New", monospace;"><span style="font-size: medium;">}</span></span></div><div><br /></div></div><div><div><b><a href="https://openjdk.org/jeps/458" target="_blank">458:<span style="white-space: pre;"> </span>Launch Multi-File Source-Code Programs</a></b></div><div><br /></div><div style="text-align: justify;">Aprimora o inicializador de aplicativos Java para poder executar um programa fornecido como vários arquivos de código-fonte Java. Isso tornará a transição de programas pequenos para programas maiores mais gradual, permitindo que os desenvolvedores escolham se e quando se dar ao trabalho de configurar uma ferramenta de compilação. Este é um recurso que já existe desde o Java 11 (<a href="https://openjdk.org/jeps/330" target="_blank">JEP 330</a>) e esta JEP realizou melhorias.</div></div><div><h3><br />Preview Features</h3></div><div><a href="https://openjdk.org/jeps/447" target="_blank"><b>447:<span style="white-space: pre;"> </span>Statements before super(...) (Preview)</b></a></div><div><br /></div><div style="text-align: justify;">Permitir que instruções sejam criadas antes da chamada a super() dentro de construtores.</div><div style="text-align: justify;">Atualmente, para garantir que os construtores sejam executados de cima para baixo, a linguagem Java exige que, no corpo de um construtor, qualquer invocação explícita de outro construtor apareça como a primeira instrução; se nenhuma invocação explícita do construtor for fornecida, uma será injetada pelo compilador.</div><div style="text-align: justify;">Às vezes precisamos validar um argumento que é passado para um construtor de superclasse. Podemos validar o argumento após o fato, mas isso significa potencialmente fazer um trabalho desnecessário. Este é um exemplo do problema que esta JEP quer resolver.</div><div><br /></div><div><a href="https://openjdk.org/jeps/457" target="_blank"><b>457:<span style="white-space: pre;"> </span>Class-File API (Preview)</b></a></div><div><br /></div><div style="text-align: justify;">Fornece uma API para processar arquivos de classe que rastreie o formato de arquivo de classe definido pela especificação da Java Virtual Machine.</div><div style="text-align: justify;">Permite que os componentes do JDK migrem para a API padrão e, eventualmente, remova a cópia interna do JDK da biblioteca ASM de terceiros.</div><div><br /></div><div><a href="https://openjdk.org/jeps/459" target="_blank"><b>459:<span style="white-space: pre;"> </span>String Templates (Second Preview)</b></a></div><div><br /></div><div style="text-align: justify;">Os modelos de string foram originalmente propostos como um recurso de visualização pelo <a href="https://openjdk.org/jeps/430" target="_blank">JEP 430</a> no JDK 21. Propomos aqui uma segunda visualização para obter experiência e feedback adicionais. Exceto por uma alteração técnica nos tipos de expressões do modelo, não há alterações em relação à primeira visualização.</div><div><br /></div><div><b><a href="https://openjdk.org/jeps/460" target="_blank">460:<span style="white-space: pre;"> </span>Vector API (Seventh Incubator)</a></b></div><div><br /></div><div style="text-align: justify;">Este JEP propõe reincubar a API no JDK 22, com pequenas melhorias na API em relação ao JDK 21. A implementação inclui correções de bugs e melhorias de desempenho. Incluímos as seguintes alterações notáveis:</div><div style="text-align: justify;">Suporta acesso vetorial com MemorySegments da heap que são apoiados por uma matriz de qualquer tipo de elemento primitivo. Anteriormente, o acesso era limitado MemorySegments da heap apoiado por uma matriz de bytes.</div><div><br /></div><div><b><a href="https://openjdk.org/jeps/461" target="_blank">461:<span style="white-space: pre;"> </span>Stream Gatherers (Preview)</a></b></div><div><br /></div><div style="text-align: justify;">Aprimora a API Stream para oferecer suporte a operações intermediárias personalizadas. Isso permitirá que pipelines de fluxo transformem dados de maneiras que não são facilmente alcançáveis com as operações intermediárias atuais. Esta é uma API de visualização.</div><div><br /></div><div><a href="https://openjdk.org/jeps/462" target="_blank"><b>462:<span style="white-space: pre;"> </span>Structured Concurrency (Second Preview)</b></a></div><div><br /></div><div style="text-align: justify;">Simplifica a programação simultânea introduzindo uma API para simultaneidade estruturada. A simultaneidade estruturada trata grupos de tarefas relacionadas executadas em diferentes threads como uma única unidade de trabalho, simplificando assim o tratamento e cancelamento de erros, melhorando a confiabilidade e aprimorando a observabilidade. Esta é uma API de visualização.</div><div><br /></div><div><b><a href="https://openjdk.org/jeps/463" target="_blank">463:<span style="white-space: pre;"> </span>Implicitly Declared Classes and Instance Main Methods (Second Preview)</a></b></div><div><br /></div><div style="text-align: justify;">Evoluir a linguagem Java para que os alunos possam escrever seus primeiros programas sem a necessidade de compreender os recursos da linguagem projetada para programas grandes. Longe de usar um dialeto separado da linguagem, os alunos podem escrever declarações simplificadas para programas de classe única e, em seguida, expandir seus programas para usar recursos mais avançados à medida que suas habilidades aumentam. Este é um recurso de visualização do idioma.</div><div><br /></div><div><a href="https://openjdk.org/jeps/464" target="_blank"><b>464:<span style="white-space: pre;"> </span>Scoped Values (Second Preview)</b></a></div><div><br /></div><div style="text-align: justify;">Introduz valores com escopo definido, que permitem o compartilhamento gerenciado de dados imutáveis tanto com quadros filhos na mesma thread quanto com threads filhas. Os valores com escopo definido são mais fáceis de raciocinar do que variáveis locais de thread e têm menores custos de espaço e tempo, especialmente quando usados em combinação com Virtual Threads e Structured Concurrency. Esta é uma API de visualização.</div><div style="text-align: justify;">Um Scoped Values é um contêiner de objeto que permite que um valor de dados seja compartilhado de forma segura e eficiente por um método com seus chamados diretos e indiretos dentro da mesma thread e com threads filhas, sem recorrer a parâmetros de método. É uma variável do tipo ScopedValue. Normalmente, ele é declarado como um campo estático final e sua acessibilidade é definida como privada para que não possa ser acessado diretamente pelo código em outras classes.</div><div style="text-align: justify;"><br /></div><h3 style="text-align: left;">Referências</h3><br /><a href="https://openjdk.org/projects/jdk/22/">https://openjdk.org/projects/jdk/22/</a></div><div><br /></div><div><a href="https://www.youtube.com/watch?v=T64dUc0wIZ0" target="_blank">https://www.youtube.com/watch?v=T64dUc0wIZ0</a></div><div><br /></div><div><br /><br /><a href="https://twitter.com/sandrogiacom"><img src="https://lh7-us.googleusercontent.com/aH3ZzHNBWziP-L4KXIPAkDRG6Cbgb1ar__QMkUH-fiYn_6fVOrR2sp9P2GTTa06uBqy8gCnlWjLDXyKJVRcp7ulreGUh2-tY9dugqFVwk_ezeA7HNiGVB3h8RHwDN8D76G82Qy1VjlxHWi51ZxfVKpY" /><br /></a><div style="text-align: justify;"><br /></div></div></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-19099415906138575702024-02-24T18:10:00.004-03:002024-02-24T18:20:07.464-03:00Introdução ao projeto OpenJDK CRaC<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Introdução ao projeto OpenJDK CRaC" name="twitter:title"></meta>
<meta content="Projeto OpenJDK CRaC: reduzindo drasticamente o tempo de inicialização de aplicativos Java" name="twitter:description"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://lh7-us.googleusercontent.com/Ue6kp9T6BOlX1iobehsN2QzYHcIj2BCS0yzcw_e4R3iaatMJJZ18CqgvYvi869zppzmJZpjeg-NPd7tubuC-mwmmITzToiGf9OcvoIFnBN5bYwqYMlZQv9ukLDyN0OJpNOxkjau1KkpCMb9DcVkMRYsjzA=s16000" name="twitter:image"></meta>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"></p><h1 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><span id="docs-internal-guid-ff589244-7fff-3a0e-a9db-e0522bbb7812" style="font-weight: normal;"><img src="https://lh7-us.googleusercontent.com/Ue6kp9T6BOlX1iobehsN2QzYHcIj2BCS0yzcw_e4R3iaatMJJZ18CqgvYvi869zppzmJZpjeg-NPd7tubuC-mwmmITzToiGf9OcvoIFnBN5bYwqYMlZQv9ukLDyN0OJpNOxkjau1KkpCMb9DcVkMRYsjzA=s16000" /></span></div></div><br /></h1><h1 style="text-align: left;">Projeto OpenJDK CRaC: reduzindo drasticamente o tempo de inicialização de aplicativos Java</h1><h3 style="line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt; text-align: left;"><span face="Arial, sans-serif" style="background-color: transparent; color: black; font-size: 15pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-weight: 400;">
</span>Um pouco de história</span></h3><div style="text-align: justify;">O objetivo do Java sempre foi ser independente de plataforma. Isto é, sem precisar compilar o código novamente, é possível rodar em qualquer dispositivo compatível com a máquina virtual (JVM). O famoso slogam (<i><b>write once, run anywhere</b></i>)</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 342px; overflow: hidden; width: 556px;"><img height="394" src="https://lh7-us.googleusercontent.com/mSP-KPAuNFFPoBhhrp7uxIrJZIhA4yH19MGtJpiNPtU-mlSpqW_8Gj3ppEdfb_luySSGI3UfxwRak87iejqkhwMgj88K3RF9-__jhHeyn8mkvn2K5sexd5YOPQ_HUlXDunUzD1h7MjcPvXZRV1e_wbw=w640-h394" style="margin-left: 0px; margin-top: 0px;" width="640" /></span></span></p><p><b style="font-weight: normal;"><br /></b></p><h3 style="text-align: left;">Desafios da inicialização de aplicativos na JVM</h3><div style="text-align: justify;">Embora o Java seja uma linguagem popular, a inicialização de aplicativos na JVM pode ser um processo demorado. Isso ocorre porque a JVM precisa realizar várias etapas antes que um aplicativo possa ser executado. Primeiro, a JVM precisa carregar e inicializar todas as classes necessárias para o aplicativo. Isso envolve ler os arquivos de classe, desempacotar arquivos JAR e inicializar todas as dependências.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Em seguida, a JVM precisa fazer algumas otimizações de tempo de execução, como compilação just-in-time (JIT) e inlining de métodos. Essas otimizações ajudam a melhorar o desempenho do aplicativo, mas levam tempo para serem concluídas. Por fim, a JVM precisa aquecer o aplicativo, o que envolve analisar o código e determinar quais partes do aplicativo devem ser otimizadas.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Esse processo pode levar muito tempo e afetar a velocidade de inicialização. Esses desafios de inicialização são especialmente problemáticos para aplicativos que precisam ser iniciados rapidamente ou executados em ambientes de contêiner, onde várias JVMs podem competir por recursos limitados. Para cada réplica do aplicativo, o mesmo processo será repetido.</div><div style="text-align: justify;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 362px; overflow: hidden; width: 696px;"><img height="362" src="https://lh7-us.googleusercontent.com/xfK9rWwNrvXwNqJPzGSqv5M_yVwCGy8K2FrK2Yl_QYKVVTDIdOQMVENZ3xdVgT7CXMd1cFSpu8wmLNM9VZHXH9zQ1idLyrQLryKbWQF0sshMyFtEyS6JVLRRgvEZOXC2Z9MeZsZOjWTH3jq1MouF9sM" style="margin-left: 0px; margin-top: 0px;" width="696" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Fonte: </span><a href="https://pt.slideshare.net/SimonRitter/java-on-crac" style="text-decoration: none;"><span face="Verdana,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">https://pt.slideshare.net/SimonRitter/java-on-crac</span></a><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span></p><br /><h3 style="text-align: left;">O mecanismo de execução</h3><div style="text-align: justify;">Depois que o bytecode é carregado na memória, ele é processado pelo mecanismo de execução da <b>JVM</b>. O mecanismo de execução consiste em vários componentes, incluindo o interpretador, o compilador <b>C1 JIT </b>e o compilador <b>C2 JIT.</b> O interpretador pega o bytecode linha por linha e o interpreta em instruções da <b>CPU</b>. A JVM observa o código e traça o perfil de sua execução, contando com que frequência os métodos são chamados. Se um método for chamado com frequência, ele será colocado no compilador C1 JIT, que o compila rapidamente, sem muitas otimizações, para reduzir o tempo de inicialização. A JVM continua a criar o perfil do código e, se um método for chamado com ainda mais frequência, ele será colocado no compilador C2 JIT, que pode produzir código altamente otimizado e de alto desempenho. Essa combinação de interpretadores e compiladores JIT permite que a JVM otimize o código à medida que ele é executado, resultando em uma execução mais rápida.</div><div style="text-align: justify;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 377px; overflow: hidden; width: 667px;"><img height="377" src="https://lh7-us.googleusercontent.com/D9xwoDz_GIGQL0DK1Z9XB8hM-0YfclkJyJ3iK_FjdQzvl7lBkN7GeElLsp5VhqaNJqKhUolU_rrCEWuUcVWaJ9a9-LRzP6TR0USF6LetVxnJorD5z8JaevhIKA1XVpLFdYNV9q5zZ8NrCT1zU1FQnG4" style="margin-left: 0px; margin-top: 0px;" width="667" /></span></span></p><br /><br /><h3 style="text-align: left;">OpenJDK CRaC: uma solução para a inicialização rápida de aplicativos na JVM</h3><div><div style="text-align: justify;">O <b>Coordinated Restore and Checkpoint</b>, ou <b>CRaC</b>, é uma solução que visa melhorar o tempo de inicialização da JVM. O CRaC permite pausar e restaurar um aplicativo baseado em JVM, eliminando a necessidade de interpretação, compilação e otimização durante a inicialização. Em vez disso, você pode criar um ponto de verificação do seu aplicativo em seu estado totalmente otimizado e começar a partir desse ponto, reduzindo significativamente o tempo que leva para o seu aplicativo atingir o desempenho total.</div><div style="text-align: justify;">Essa solução foi desenvolvida para permitir que aplicativos na JVM sejam iniciados mais rapidamente, reduzindo o tempo necessário para carregar e inicializar classes, bem como para realizar otimizações JIT.</div></div><br /><h3 style="text-align: left;">Como funciona</h3><div style="text-align: justify;">O <b>CRaC</b> é baseado em um recurso do <b>Linux</b> chamado <b>CRIU</b>, um projeto para implementar funcionalidade de checkpoint/restore para Linux.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Checkpoint/Restore In Userspace, ou CRIU</b> é um software Linux criado em 2013. Ele pode congelar um contêiner em execução (ou um aplicativo individual) e verificar seu estado no disco. Os dados salvos podem ser usados para restaurar o aplicativo e executá-lo exatamente como estava durante o congelamento.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>CRaC</b> só funciona no sistema operacional Linux no momento porque a implementação do OpenJDK depende deste recurso</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">O <b>CRaC</b> exige que todos os arquivos e conexões de rede sejam fechados antes de tirar um snapshot e após restaurá-lo. É por isso que o CRaC requer suporte no tempo de execução Java e no framework. A API CRaC também permite que aplicativos Java atuem antes de um snapshot ser obtido e depois de restaurado. Os aplicativos podem obter um snapshot por meio de uma chamada de API CRaC ou com o utilitário Java jcmd. Um OpenJDK com suporte ao CRaC carrega um snapshot com a opção de linha de comando <b>-XX:CRaCRestoreFrom</b>.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">O CRaC funciona tirando uma foto (<b>snapshot</b>) do estado do seu aplicativo, incluindo a memória JVM e os recursos que ele está usando, e armazenando-o em <b>arquivos</b>. Essa foto, ou ponto de verificação, pode então ser usada para restaurar seu aplicativo ao estado anterior. Ao restaurar a partir de um ponto de verificação, a JVM é essencialmente iniciada de onde parou, ignorando as fases de interpretação, compilação e otimização. Isso permite que seu aplicativo atinja desempenho total quase instantaneamente.</div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 185px; overflow: hidden; width: 693px;"><img height="185" src="https://lh7-us.googleusercontent.com/MoqT2WJwN3U3CiSk-XTUkQpofPaS3DJ7JkG753iUm9lDvjmQinB1eS0Bz37F8NGyrtC9GTFJFHIbSuThwBfg-2glnxknGbvlDPWqDanbeSIZSYdwZnfjAGoBbW9r9UBSYifKChTUhaBkB4C6atJ83I4" style="margin-left: 0px; margin-top: 0px;" width="693" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">Fonte: <a href="https://pt.slideshare.net/SimonRitter/java-on-crac">https://pt.slideshare.net/SimonRitter/java-on-crac</a> <br /><br /></p><h3 style="text-align: left;">Distribuições da OpenJDK com CRaC</h3><div style="text-align: justify;"><br /></div><div style="text-align: justify;">O projeto CRaC foi aceito no OpenJDK em agosto de 2021, o que significa sua importância para o futuro do Java. Porém ainda está longe de ser incluído no projeto principal.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Algumas distribuições JDK, incluindo <b>Azul Zulu JDK</b> e <b>BellSoft Liberica JDK </b>já oferecem suporte CRaC integrado. Frameworks como Micronaut, Quarkus e Spring já integraram suporte CRaC.</div><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><h3 style="text-align: left;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Utilização de outras linguagens na JVM</span></h3><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><div style="text-align: justify;">O OpenJDK CRaC também permite que aplicativos escritos em outras linguagens, como Kotlin, sejam executados na JVM com a mesma rapidez e eficiência.</div><div style="text-align: justify;"><br /></div></span><h3 style="text-align: left;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Benefícios</span></h3><p></p><div style="text-align: justify;">Os benchmarks mostram que o CRaC pode reduzir os tempos de inicialização em <b>90% ou mais</b>, levando a tempos de resposta de serviço mais rápidos e melhor desempenho.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Os aplicativos atingem o desempenho máximo muito mais rapidamente após serem restaurados, melhorando ainda mais a capacidade de resposta resultando em melhor utilização de recursos: Menos CPU e memória são usadas durante as inicializações, liberando recursos para outras tarefas.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Existem vários benefícios em usar o CRaC para melhorar o tempo de inicialização da JVM:</div><div style="text-align: justify;"><br /></div><ul style="text-align: left;"><li style="text-align: justify;"><b>Tempo rápido para desempenho total:</b> ao iniciar seu aplicativo a partir de um ponto de verificação, você pode obter desempenho total quase instantaneamente, sem esperar pela interpretação, compilação e otimização.</li><li style="text-align: justify;"><b>Eliminação de sobrecarga de interpretação e compilação:</b> com o CRaC, você pode ignorar as fases de interpretação e compilação durante a inicialização, reduzindo o tempo que leva para seu aplicativo ficar totalmente otimizado.</li><li style="text-align: justify;"><b>Capacidade de resposta aprimorada:</b> ao reduzir o tempo de inicialização da JVM, seu aplicativo pode responder mais rapidamente, proporcionando uma melhor experiência ao usuário.</li><li style="text-align: justify;"><b>Economia de custos:</b> com tempos de inicialização mais rápidos, você pode reduzir o número de nós de alta potência necessários em sua infraestrutura de nuvem, resultando em economia de custos.</li></ul><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 369px; overflow: hidden; width: 642px;"><img height="369" src="https://lh7-us.googleusercontent.com/rbgFd3jGElkm2OUKdSh-8h1EWRwrfXaOQJ2qxcWB9aWb7MCW0Rj0o7xjocfM0j9Zva-wn7c6lBhPoGxzrabOnBxKtbLQCRNYya1H_LbUMAgV3HdNHJ0iVKfsCTj-91K7jg8PSk9a2aTUJ8RIVBkLPFM" style="margin-left: 0px; margin-top: 0px;" width="642" /></span></span></p>Comparativo de aplicações iniciadas sem o CRaC e com o CRaC<br />Fonte: <a href="https://pt.slideshare.net/SimonRitter/java-on-crac">https://pt.slideshare.net/SimonRitter/java-on-crac</a> <br /><br /><h3 style="text-align: left;">Na prática</h3><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Nesta prova de conceito, temos uma aplicação <b>Spring Boot 3.2</b> rodando com a <b>Azul Zulu JDK 21</b>. E para que possamos testar em Sistemas Operacionais como <b>Mac</b> e <b>Windows</b>, vamos utilizar o <b>Docker</b> para simular um ambiente <b>Linux</b>.</div><div style="text-align: justify;"><br /></div>O código fonte da aplicação está disponível em <a href="https://github.com/sandrogiacom/crac-demo">https://github.com/sandrogiacom/crac-demo</a> <br /><br /><div style="text-align: justify;">O <b>CRaC</b> exige que todos os arquivos e conexões de rede sejam fechados antes de tirar um snapshot e reabri-lo após restaurá-lo. É por isso que o CRaC requer suporte no tempo de execução Java e no framework. A API CRaC também permite que os aplicativos Java atuem antes de um snapshot ser obtido e depois de restaurado. Os aplicativos podem obter um snapshot por meio de uma chamada de API CRaC ou com o utilitário Java <b>jcmd</b>. O Azul OpenJDK carrega um snapshot com a opção de linha de comando <b>-XX:CRaCRestoreFrom</b>.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Para inicializar a aplicação, é necessário informar o parametro <b>-XX:CRaCCheckpointTo=$PATH</b> onde o $PATH é o local no disco onde a JDK irá utilizar para gravar os arquivos para posteriormente restaurar. Ex: </div><div style="text-align: justify;"><b>java -XX:CRaCCheckpointTo=cr -jar demo.jar</b></div><div style="text-align: justify;"><br /></div><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 299px; overflow: hidden; width: 718px;"><img height="299" src="https://lh7-us.googleusercontent.com/V194I3JVeoXuwBGrbBFfyy9YafSvJVrLglBTl_GspU5_8B7WTrjNdKHLtjfCGe_2m0okOi47eEQY_C163DQuj1_qnyM8xx1Lv7jJNmly65xvsfExoAjVCEDceccOr8NwCfLrInnWs5EcsbWoLMom00w" style="margin-left: 0px; margin-top: 0px;" width="718" /></span></span></p>Com a aplicação em execução, basta obter um snapshot através do comando: <div><b>jcmd demo.jar JDK.checkpoint</b><br /><br /><div>Para fazer isso, abra um novo terminal, entre no container e execute o checkpoint:<br /><br /><div><ol style="text-align: left;"><li><b>Entrando no container em execução</b>: docker exec -it demo_crac /bin/bash</li><li><b>Obtendo o checkpoint:</b> jcmd demo.jar JDK.checkpoint</li></ol><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 103px; overflow: hidden; width: 470px;"><img height="103" src="https://lh7-us.googleusercontent.com/jcsc-AqpX4wZF95acZAZTwZcfEzexAWTPE8-nbjo70kOkf8YYw5rL-gTuzI04vYcQ3NZcqkdUIAyiKISBYV8fKMm4S0C-PY73z83S2ghJuB4-tyHoXnqfsbGn6XxW025yPVJINPzSkJIK9OJGTP_ws0" style="margin-left: 0px; margin-top: 0px;" width="470" /></span></span></p><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 119px; overflow: hidden; width: 540px;"><img height="119" src="https://lh7-us.googleusercontent.com/4EMT8BBxc-gbQt_XIlriB7cFRtPlHIiuqgzmT2Z8PJwn2uZ2PAnV_2Fdbd8z4vHk4ULelH3pRDdvIdraQD7N5oIjBU7YlaV23swPg7HTXgHKFi5nPArrUq9sLSWgo311o8zL8nKYSpUM7MZ2YMDnmEI" style="margin-left: 0px; margin-top: 0px;" width="540" /></span></span></p><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><div style="text-align: justify;">Neste momento serão gerados vários arquivos no local indicado na variável <b>$PATH.</b> A aplicação será interrompida após um <b>snapshot</b> ser executado com sucesso.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Para restaurar a aplicação a partir de um snapshot, execute o seguinte comando: java -XX:CRaCRestoreFrom=$PATH. </div><div style="text-align: justify;">Ex:<b> java -XX:CRaCRestoreFrom=cr</b></div><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Verdana,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 148px; overflow: hidden; width: 718px;"><img height="148" src="https://lh7-us.googleusercontent.com/T3MFOjxAZ8b4L3ts9rv4ZB8_54Exn3oG17sHlQ41ms1hIcs-OYNiXIAV95rbmzWblR0ST0D268ug4JuDiniLiAzgWd-hd8svMbkGpyZPoTx-0TgjhP70nzOP0L0lCGwBafGOdRocaR5CNdNyv2Ztd7Y" style="margin-left: 0px; margin-top: 0px;" width="718" /></span></span></p><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p>Aplicação inicializada a partir de um snapshot em <b>59 milisegundos<br /></b><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><h3 style="text-align: left;">Conclusão:</h3><div style="text-align: left;"><div style="text-align: justify;"><br /></div><div style="text-align: justify;">CRaC apresenta uma abordagem inovadora para superar gargalos de inicialização de JVM, oferecendo lançamentos mais rápidos sem sacrificar o desempenho. Sua adequação depende das características específicas da aplicação e de considerações técnicas. Os desenvolvedores interessados em otimizar os tempos de inicialização de microsserviços devem acompanhar de perto o desenvolvimento do CRaC e avaliar seu potencial para suas necessidades específicas.</div><div><br /><h3>Referências<br /><br /><br /><a href="https://github.com/CRaC/docs">https://github.com/CRaC/docs</a><br /><br /><a href="https://youtu.be/Vy1EbB2kBBs">[VDCLUJ22] Gerrit Grunwald - What the CRaC Superfast JVM startup</a><br /><br /><a href="https://bell-sw.com/blog/how-to-use-crac-with-java-applications/">https://bell-sw.com/blog/how-to-use-crac-with-java-applications/</a></h3><h3><br /></h3><h3><a href="https://twitter.com/sandrogiacom" style="font-size: 11pt; white-space-collapse: preserve;" target="_blank"><img height="89" src="https://lh7-us.googleusercontent.com/aH3ZzHNBWziP-L4KXIPAkDRG6Cbgb1ar__QMkUH-fiYn_6fVOrR2sp9P2GTTa06uBqy8gCnlWjLDXyKJVRcp7ulreGUh2-tY9dugqFVwk_ezeA7HNiGVB3h8RHwDN8D76G82Qy1VjlxHWi51ZxfVKpY" style="margin-left: 0px; margin-top: 0px;" width="200" /></a></h3></div></div><div><span><div><span face="Roboto, sans-serif" style="color: #252525; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></div></div></div></div><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-89350290553303375002023-12-26T18:19:00.008-03:002023-12-26T18:29:45.828-03:00<div class="separator"><p style="margin-left: 1em; margin-right: 1em;"> <img height="268" src="https://lh7-us.googleusercontent.com/Fbcm1W-mRdqCFnyix_Nu9p6oySp_5EqOYaPEn5bAUcnKIsOnZz9KZxb63vlEFz9eZf1C_pxWrCP10GYadGZ-siS6mfausFfGohn7J8avnnEthu64LtvPKEKN8EUqFZeiFEUD5ZNwDExFEnt-g6dk5zE=w320-h268" style="font-family: Arial, sans-serif; font-size: 11pt; margin-left: 0px; margin-top: 0px; text-align: center; white-space-collapse: preserve;" width="320" /></p></div><span id="docs-internal-guid-9c0592a5-7fff-8d90-3ee4-94c242ce9f03"><br /><br /><h1 style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 26pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Retrospectiva 2023</span></h1><br /><div style="text-align: justify;"><span style="font-family: helvetica;"><span style="font-size: x-large;">2023 foi um ano interessante para o ecossistema Java. Relembrando que o Java foi lançado a quase <b>30 anos</b>, e desde então, o grande desafio sempre foi a questão da performance, manter a estabilidade e retrocompatibilidade. O objetivo do Java sempre foi ser independente de plataforma. Isto é, sem precisar compilar o código novamente, é possível rodar em qualquer dispositivo compatível com a máquina virtual. O famoso slogam (<i><b>write once, run anywhere</b></i>)</span></span></div></span><div><span style="font-family: helvetica;"><br /><div style="text-align: justify;"><span style="font-size: x-large;">Muitos acreditam que o peso desta responsabilidade impede que o Java inove com a velocidade que a comunidade espera. Uma vez que outras linguagens acabam liberando recursos importantes antes do Java. Isso vem mudando desde o lançamento do novo modelo de release a cada seis meses. Atualmente temos dois lançamentos anuais, sendo o primeiro em <b>março</b> e outro em <b>setembro</b>. Uma versão de longo suporte (<b>LTS</b>) a cada três anos. Isto proporciona que a indústria experimente novos recursos, frameworks se atualizem para a próxima versão LTS, tal como o <b>JDK 21</b>.<br /><br /></span></div></span><span style="font-size: x-large;"><div style="text-align: justify;"><span style="font-family: helvetica;">Foi preciso fazer esta breve introdução para podermos falar das grandes entregas do ecossistema <b>Java em 2023</b>. Java ainda é relevante na comunidade e vai conseguir continuar evoluindo para os próximos anos?<br /></span></div><div style="text-align: justify;"><span style="font-family: helvetica;"><br /></span></div><div style="text-align: justify;"><span style="font-family: helvetica;">Leia o texto abaixo e tire suas conclusões. Comentários são bem vindos!</span></div><div style="text-align: justify;"><span style="font-family: helvetica;"><br /></span></div></span><div><br /><h3 style="text-align: left;"><span style="font-family: helvetica; font-size: x-large;"><span face="Arial, sans-serif" style="white-space-collapse: preserve;">Novos Java Champions</span></span></h3></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 115px; overflow: hidden; width: 98px;"><img height="115" src="https://lh7-us.googleusercontent.com/GRlLT3djR3VutUFHkEvw7fMZUXcy__yLYVbIKhaz8NpsPhNqoo3aun5GUM0ySmUv0a7QekERV-LXuDsuVeUoZW38OQ91aSAb4cwJ5QVcZuXjHM_QiB132jepuyWDhXAMRp0Y0ARPo0hCIkbDa6VvQM0" style="margin-left: 0px; margin-top: 0px;" width="98" /></span></span><span style="font-family: helvetica; font-size: x-large;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Este ano, </span><a href="https://javachampions.org/members.html" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">18 novos membros</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> entraram para o time, destacando os brasileiros </span><a href="https://twitter.com/eliasnogueira" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Elias Nogueira</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">e</span><a href="https://twitter.com/prof_isidro" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"> Francisco (Professor) Isidro</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></span></p><div style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: justify;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: helvetica; font-size: x-large;">Parabéns!!</span></span></div><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></h3><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JDK 21</span></h3><div><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;">Este ano (<b>2023</b>) foram lançadas duas versões, <b>20</b> e <b>21</b>, sendo que a 21 é a mais importante por se tratar de uma versão de <b>longo suporte</b> e por ter entregado features relevantes como <a href="https://openjdk.org/jeps/444" target="_blank">Virtual Threads</a>, <a href="https://openjdk.org/jeps/431" target="_blank">Sequenced Collections</a>, <a href="https://openjdk.org/jeps/441" target="_blank">Pattern Matching for switch</a>, <a href="https://openjdk.org/jeps/440" target="_blank">Record Patterns</a>, <a href="https://openjdk.org/jeps/430" target="_blank">String Templates (Preview)</a> e <a href="https://openjdk.org/jeps/439" target="_blank">Generational ZGC</a>.</span></div><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></h3><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JVM Language Summit 2023
</span></h3><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;">O JVM Language Summit é uma colaboração técnica aberta entre designers de linguagens, escritores de compiladores, construtores de ferramentas, engenheiros de runtime e arquitetos da VM. Compartilham experiências como criadores de JVM e de linguagens de programação para JVM. Também participam desenvolvedores não-JVM e tecnologias semelhantes para participar ou falar sobre seu runtime, VM ou sua linguagem favorita. A JVM LS 2023 aconteceu no início de agosto de 2023 em Santa Clara – CA.</span></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;"><a href="https://youtube.com/playlist?list=PLX8CzqL3ArzW90jKUCf4H6xCKpStxsOzp&si=VZNyGMlKXgSYl2sA">Neste link</a> pode-se acompanhar as palestras.</span></div><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;"><br /></span></div><h3 style="text-align: left;"><span face="Arial, sans-serif" style="font-size: 20pt; text-align: justify; white-space-collapse: preserve;">Projeto CRaC</span></h3><span style="font-family: helvetica; font-size: x-large;"><div style="text-align: justify;">Coordinated Restore at Checkpoint (CRaC) é um projeto que promete um mecanismo do tipo checkpoint/restore. Ele permite fechar arquivos e conexões, despejar o cache antes do ponto de verificação e reabrir/recuperar tudo quando o aplicativo for restaurado a partir da imagem. Pode ser comparado como o hibernar do seu computador. Isto significa que quando a aplicação for reiniciada, ela estará disponível quase que imediatamente.<br /><br /></div><div style="text-align: justify;">É possível utilizar uma versão específica do OpenJDK com o CRaC inclusa. A azul disponibiliza no OpenJDK 17. <a href="https://www.azul.com/products/components/crac/">https://www.azul.com/products/components/crac/</a></div></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">GraalVM</span></h1><div><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><span style="font-family: helvetica; font-size: x-large;"><div style="text-align: justify;">Em 2023, o GraalVM Community Edition se alinhou com a cadência de lançamento do JDK de seis meses. Haverá dois lançamentos de recursos por ano para oferecer suporte à versão mais recente do JDK. Um novo lançamento de recurso substitui todos os lançamentos anteriores. As versões do GraalVM são nomeadas de acordo com a versão do JDK que fornecem, por exemplo, GraalVM para JDK 21.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">A GraalVM para Java 21 também passa a ter uma nova licença (GFTC). O GFTC destina-se a permitir o uso por qualquer usuário, incluindo uso comercial e de produção. A redistribuição é permitida desde que não seja mediante pagamento de taxa.</div><div style="text-align: justify;"><br /></div></span><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Spring Boot, Quarkus e Micronaut
</span></h3><span style="font-family: helvetica; font-size: x-large;"><a href="https://spring.io/blog/2023/11/23/spring-boot-3-2-0-available-now/">Spring boot 3.2</a> lançado em novembro de 2023 traz como as principais novidades:<br /><ul style="text-align: left;"><li><span style="font-family: helvetica; font-size: x-large;">Suporte para Virtual Threads</span></li><li><span style="font-family: helvetica; font-size: x-large;">Suporte inicial para JVM Checkpoint Restore (Project CRaC)</span></li><li><span style="font-family: helvetica; font-size: x-large;">Melhorias para Observabilidade</span></li><li><span style="font-family: helvetica; font-size: x-large;">Atualmente está na versão 3.2.1</span></li></ul></span><span style="font-family: helvetica; font-size: x-large;"><div style="text-align: justify;"><a href="https://pt.quarkus.io/blog/quarkus-3-0-final-released/">Quarkus 3.0</a> lançado em abril de 2023, é baseado no Jakarta EE 10 e, não é a única mudança. Esta versão vem repleta de novos recursos e melhorias que foram implementadas nesta versão.</div><div style="text-align: justify;">O Quarkus 3.0 agora possui uma nova Dev UI que é mais extensível e fácil de usar. Ele também tem uma aparência nova e muito melhorada.</div><div style="text-align: justify;">O Eclipse MicroProfile 6.0 se alinha ao Jakarta EE 10 Core Profile e substitui o MicroProfile OpenTracing pela MicroProfile Telemetry.</div><div style="text-align: justify;"><ul><li>Hibernate ORM 6</li><li>Suporte para Maven 3.9 e Gradle 8</li><li>Atualmente está na versão 3.6.4</li></ul></div></span></div><div><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;"><a href="https://micronaut.io/2023/07/14/micronaut-framework-4-0-0-released/">Micronaut 4.0</a> lançado em julho de 2023.</span></div><span><span style="font-family: helvetica; font-size: x-large;"><ul style="text-align: left;"><li><span><span style="font-family: helvetica; font-size: x-large;">Foi atualizado para a ter como baseline o Java 17, kotlin 1.8 e groovy 4.0</span></span></li><li><span><span style="font-family: helvetica; font-size: x-large;">Atualmente está na versão 4.2.2</span></span></li></ul></span><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: left;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></h3><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: left;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Oracle VS Code Extension
</span></h3><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;">A extensão Oracle Java Platform traz desenvolvimento Java completo (editar-compilar-depurar e ciclo de teste) para projetos Maven e Gradle para VSCode. Bem como outros recursos.</span></div><div style="text-align: justify;"><a href="https://marketplace.visualstudio.com/items?itemName=Oracle.oracle-java"><span style="font-family: helvetica; font-size: x-large;">https://marketplace.visualstudio.com/items?itemName=Oracle.oracle-java</span></a></div><h1 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: left;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></h1><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: left;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Java Playground</span></h3><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;">O Java Playground é uma ferramenta online simples que ajuda você a explorar os recursos da linguagem Java. Nenhuma configuração necessária, digite seu trecho Java e execute-o! O Java Playground atualmente é executado no Oracle JDK - Java 21 com recursos de visualização habilitados.</span></div><div style="text-align: justify;"><a href="https://dev.java/playground/"><span style="font-family: helvetica; font-size: x-large;">https://dev.java/playground/</span></a></div><h1 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: left;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">
</span></h1><h3 style="text-align: left;"><span face="Arial, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">O Java 8 ainda é dominante?</span></h3><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;">Segundo o levantamento da newrelic, mais de 56% dos aplicativos agora usam Java 11 em produção (contra 48% em 2022 e 11% em 2020). Java 8 vem em segundo lugar, com quase 33% dos aplicativos usando-o na produção (contra 46% em 2022).</span></div><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;"><br /></span></div><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;">Embora o Java 11 tenha mantido o primeiro lugar por dois anos consecutivos, a taxa de adoção do Java 17 excedeu em muito o que o mundo dos desenvolvedores viu quando o Java 11 foi introduzido. Mais de 9% dos aplicativos agora usam Java 17 em produção (contra menos de 1% em 2022), representando uma taxa de crescimento de 430% em um ano. Demorou anos para que o Java 11 chegasse perto desse nível.</span></div><div style="text-align: justify;"><a href="https://newrelic.com/resources/report/2023-state-of-the-java-ecosystem"><span style="font-family: helvetica; font-size: x-large;">https://newrelic.com/resources/report/2023-state-of-the-java-ecosystem</span></a></div><div style="text-align: justify;"><span style="font-family: helvetica; font-size: x-large;">Já na pesquisa da jetbrains, o Java 8 ainda é o mais utilizado em produção:</span></div><div style="text-align: justify;"><a href="https://www.jetbrains.com/lp/devecosystem-2023/java/#java_versions"><span style="font-family: helvetica; font-size: x-large;">https://www.jetbrains.com/lp/devecosystem-2023/java/#java_versions</span></a></div><h3 style="line-height: 1.9872; margin-bottom: 3pt; margin-top: 20pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 20pt; white-space-collapse: preserve;"><br /></span></h3><h3 style="line-height: 1.9872; margin-bottom: 3pt; margin-top: 20pt; text-align: justify;"><span face="Arial, sans-serif" style="font-size: 20pt; white-space-collapse: preserve;">Referências</span></h3><p style="line-height: 1.9872; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><a href="https://youtu.be/NxpHg_GzpnY" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: helvetica; font-size: x-large;">https://youtu.be/NxpHg_GzpnY</span></span></a></p><br /><br /><p style="line-height: 1.9872; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><a href="https://twitter.com/sandrogiacom" target="_blank"><img height="89" src="https://lh7-us.googleusercontent.com/aH3ZzHNBWziP-L4KXIPAkDRG6Cbgb1ar__QMkUH-fiYn_6fVOrR2sp9P2GTTa06uBqy8gCnlWjLDXyKJVRcp7ulreGUh2-tY9dugqFVwk_ezeA7HNiGVB3h8RHwDN8D76G82Qy1VjlxHWi51ZxfVKpY" style="margin-left: 0px; margin-top: 0px;" width="200" /></a></span></span></p><div style="text-align: left;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><br /></span></span></div></span></div><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-49231040628388474742023-10-08T18:41:00.004-03:002023-10-08T18:47:11.032-03:00Java 21 não é versão LTS<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Java 21 não é versão LTS" name="twitter:title"></meta>
<meta content="Java 21 não é uma versão com suporte de longo prazo porque não é algo que possa obter suporte de longo prazo." name="twitter:description"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE1lmsnGPtB_HYWgB4qceC-emJHqkX6fzzkNJk0-gJb4HOF_rJyK0BdKFWab54k7dbUfWFSVUDv45zr2Iy1k2yl6jCbYq0DQS-Ya6mYA0Y2YvIrQmeU9ibYidp9SrmvbMltqbWfcMTiOm8uBXip1vggrd3tewlLX5mmPGxG1PIdULQTcaZRWoEhc82Gcrx/s320/java21ia.png" name="twitter:image"></meta>
<span id="docs-internal-guid-fd70f012-7fff-665a-74de-12facfb836da"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br /></div></div></span><span><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE1lmsnGPtB_HYWgB4qceC-emJHqkX6fzzkNJk0-gJb4HOF_rJyK0BdKFWab54k7dbUfWFSVUDv45zr2Iy1k2yl6jCbYq0DQS-Ya6mYA0Y2YvIrQmeU9ibYidp9SrmvbMltqbWfcMTiOm8uBXip1vggrd3tewlLX5mmPGxG1PIdULQTcaZRWoEhc82Gcrx/s375/java21ia.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="338" data-original-width="375" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE1lmsnGPtB_HYWgB4qceC-emJHqkX6fzzkNJk0-gJb4HOF_rJyK0BdKFWab54k7dbUfWFSVUDv45zr2Iy1k2yl6jCbYq0DQS-Ya6mYA0Y2YvIrQmeU9ibYidp9SrmvbMltqbWfcMTiOm8uBXip1vggrd3tewlLX5mmPGxG1PIdULQTcaZRWoEhc82Gcrx/s320/java21ia.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;">Se você é do mundo Java, deve saber que o Java 21 foi lançado no dia <a href="https://openjdk.org/projects/jdk/21/" target="_blank">19/09/2023</a> e até um tempo antes, não se sabia se a versão iria ser uma versão de longo suporte ou não.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;">O fato é que projeto Java (OpenJDK) não oferece uma versão com longo suporte (LTS), assim como aconteceu com o Java 11 e 17. Mas como assim?</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;">Quem oferece o suporte de longo prazo com atualizações de segurança são os fornecedores que geram suas próprias distribuições. <a href="https://www.oracle.com/java/technologies/downloads/" target="_blank">Oracle JDK</a> por exemplo. Além de muitas outras como Microsoft, Azul, Adoptium, Amazon, IBM, RedHat que são algumas das principais.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;">Para entender melhor, vamos separar o Java do JDK, OpenJDK dos seus fornecedores, manutenção e de suporte para entender melhor como tudo isso funciona.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><b>Java 21</b> na verdade é um atalho para o termo: J<b>ava Platform Standard Edition 21. </b>Mas você não pode fazer nada com isso pois não é nem código, nem um binário que você possa instalar. Ela é um conjunto de especificações que definem a linguagem, sua API, uma máquina virtual e mais algumas coisas.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><b>Java Development Kit (JDK)</b> é o que recebe novos commits e essa é a base de código que contém a implementação da especificação do Java 21 por exemplo. Este código por sua vez, é desenvolvido pela OpenJDK e seus códigos fontes podem ser encontrados no <a href="https://github.com/openjdk/jdk21" target="_blank">github</a>. E a partir de que a versão 21 é lançada, o repositório é arquivado e muda o foco para manutenções em outro <a href="https://github.com/openjdk/jdk21u" target="_blank">repositório</a>, onde a comunidade mantém as atualizações para fornecer após o lançamento.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><b>Manutenção e Suporte</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 18.6667px; white-space-collapse: preserve;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span><span style="font-family: Arial; font-size: 18.6667px; white-space-collapse: preserve;">Desde que a cadência de lançamento de seis meses foi implementada, Rob McKenna da Oracle, líder do projeto de atualizações do JDK, é o mantenedor de cada jdk$VERSIONu durante os primeiros seis meses. Depois disso ele deixa este cargo e começa a trabalhar na jdk$VERSION+1u e oferece a liderança do projeto </span></span><span style="font-family: Arial; font-size: 18.6667px; white-space-collapse: preserve;">jdk$VERSIONu para outro membro confiável da comunidade que queira manter.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: helvetica; font-size: large;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: helvetica; font-size: large;">Para algumas versões, como 11, 17 e provavelmente 21, isso acontece e o fork continua com correções contínuas. Mas não há garantias de que isso aconteça, pois não existe nenhum período de tempo definido contratualmente para para manter as atualizações. Para outras versões, o fork é fechado e ninguém mais pode atuar em atualizações.</span></p></span><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Roboto, arial, sans-serif" style="background-color: white; color: #252525; font-size: 18px; text-align: left;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Roboto, arial, sans-serif" style="background-color: white; color: #252525; font-family: helvetica; font-size: 18px; text-align: left;"><b>Manutenção</b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span face="Roboto, arial, sans-serif" style="background-color: white; color: #252525; font-family: helvetica; font-size: 18px; text-align: left;"><b><br /></b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">Manter uma versão JDK dá muito trabalho e, portanto, requer uma quantidade considerável de tempo de algumas pessoas. Existem pessoas que utilizam o seu tempo livre para fazer isso e a maioria das contribuições vêm de grandes empresas.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">Mas por que uma grande empresa investiria recursos valiosos na manutenção de um fork antigo de atualizações do JDK?</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">Existem muitas razões pelas quais uma empresa, mas a principal é porque lucram com uma versão do JDK bem mantida. Seja rodando na própria cloud, distribuem software que dependem do JDK ou oferecem suporte do Java para seus clientes.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><b>Suporte</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><b><br /></b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">E por causa deste suporte é que empresas oferecem o "suporte a longo prazo", então resumindo:</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">O OpenJDK manterá o JDK 21, a implementação de referência da plataforma Java SE 21 por pelo menos seis meses, mas provavelmente por alguns anos nas versões mais utilizadas. Os fornecedores, por outro lado, construirão seus próprios JDKs a partir da base de código da OpenJDK. Eles podem disponibilizá-los gratuitamente e também podem oferecer um suporte comercial.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><b>Comunidade</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">Mas então se as empresas é que definem quanto tempo vão dar de suporte e em qual versão, como temos sempre uma versão LTS e um tempo determinado?</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">É aí que entra a colaboração da comunidade, pois como a maior parte do código da JDK é trabalhada por todos os envolvidos, acabam optando pelas mesmas versões e prazos.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">Por mais que as maiores empresas em torno do JDK sejam concorrentes diretas, existe um nível de coordenação e cooperação para elevar o Java a este nível de qualidade e organização.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><b>Referência</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525; font-family: helvetica;">Espero que tenham gostado e se preferirem ver a explicação direto no Nicolai Parlog da Oracle, é só dar play no vídeo abaixo:</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"><span face="Roboto, arial, sans-serif" style="color: #252525;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-size: 18px; text-align: left;"></span></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="384" src="https://www.youtube.com/embed/3bfR22iv8Pc" width="461" youtube-src-id="3bfR22iv8Pc"></iframe></div><br /><span face="Roboto, arial, sans-serif" style="color: #252525;"><br /></span><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p></span><div align="left" dir="ltr" style="margin-left: 0pt;"><div style="text-align: justify;"><div style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span id="docs-internal-guid-7415375f-7fff-10a5-0a3d-279219bf8e89" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span><span><span><span><span><p dir="ltr" style="font-family: Arial; line-height: 1.656; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/U668llIYrYpJtwK80V9Q7wiomO1op3ZBGGXAne2mKqhC2nhjfnqL98sfNysuIT_GmG5YeOXiY6TZVizTaV4nGHpTo3gvpFrazKk0n0bPvJOSaZIFYuWU0lx32QqA2MTaVsizjYLFS_4tFGPYEzZKR-UUSXQHv-bJ1tSPvUFnX6rKB0dfAruzADGFZbLdqg" style="cursor: move; margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><div style="font-family: Arial;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></div></span></span></span></span></span></span></div></div></div><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-55632469393790687552023-07-10T21:32:00.004-03:002023-07-10T21:34:39.741-03:00Conheça o instancio<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Conheça o instancio" name="twitter:title"></meta>
<meta content="ma biblioteca Java para automatizar a configuração de dados em testes de unidade." name="twitter:description"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://lh3.googleusercontent.com/NRmvYo8WD6qEHBpVLGrznXjR7zG_B5TwWF8QqxLManEi5RagN-254DazpD_wccKDaKrNwzg4OXbGH72r0_Qoduiq_HVp2v3YzdkEr_Immr4HZ3rEnpgE1Qqx9RSN-0p05M8M_EczZNTL4gBcvEC6qpM" name="twitter:image"></meta>
<p><span style="font-family: Arial; font-size: 26pt; white-space-collapse: preserve;">Uma biblioteca Java para automatizar a configuração de dados em testes de unidade.</span></p><span id="docs-internal-guid-fd70f012-7fff-665a-74de-12facfb836da"><br /></span><span><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 188px; overflow: hidden; width: 233px;"><img height="188" src="https://lh3.googleusercontent.com/NRmvYo8WD6qEHBpVLGrznXjR7zG_B5TwWF8QqxLManEi5RagN-254DazpD_wccKDaKrNwzg4OXbGH72r0_Qoduiq_HVp2v3YzdkEr_Immr4HZ3rEnpgE1Qqx9RSN-0p05M8M_EczZNTL4gBcvEC6qpM" style="margin-left: 0px; margin-top: 0px;" width="233" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Neste post, vou apresentar a biblioteca instancio (<a href="http://www.instancio.org" target="_blank">www.instancio.org</a>), uma ferramenta poderosa para facilitar a criação de testes unitários em Java. A biblioteca instancio permite instanciar objetos complexos com apenas uma linha de código, evitando a necessidade de escrever construtores, setters ou builders. Além disso, a biblioteca instancio é compatível com o Junit, o framework mais popular para testes unitários em Java.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Para ilustrar o uso da biblioteca instancio, vou usar um exemplo de um sistema de escola que oferece cursos aos alunos. O sistema possui as classes Curso, Aluno, Plrofessor e Matricula, que representam os conceitos do domínio. Cada classe possui vários atributos e métodos, que não serão detalhados aqui por questão de simplicidade. O objetivo é testar o método matricularAluno da classe Curso, que recebe um objeto Aluno e cria uma nova Matricula associada ao curso e ao aluno.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Sem a biblioteca instancio, para criar um objeto Curso e um objeto Aluno para o teste, seria necessário escrever algo como:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-aa6ac43a-7fff-b7a7-97c0-9759e1696e93"></span></span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Curso curso = </span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">new</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> Curso();</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">curso.setId(1);</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">curso.setNome(</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">"Java Básico"</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">);</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">curso.setCargaHoraria(40);</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">curso.setPreco(500.0);</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Aluno aluno = </span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">new</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> Aluno();</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">aluno.setId(1);</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">aluno.setNome(</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">"João"</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">);</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">aluno.setEmail(</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">"joao@gmail.com"</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">);</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">aluno.setTelefone(</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">"999999999"</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">); </span></p></td></tr></tbody></table><br /></div></span><div align="left" dir="ltr" style="margin-left: 0pt;"><span><span id="docs-internal-guid-6dd8d908-7fff-f598-7e0a-bd3e39c4ee58"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Com a biblioteca instancio, basta escrever:
</span></p></span><span><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-62b021da-7fff-3c4c-2c53-cd69a3f429fe"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Curso curso = Instancio.instance(Curso.class);<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Aluno aluno = Instancio.instance(Aluno.class);</span></p></td></tr></tbody></table></div></span></span></div><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">A biblioteca instancio se encarrega de gerar valores aleatórios e válidos para os atributos das classes, seguindo algumas regras simples. Por exemplo, se o atributo é do tipo String, a biblioteca gera uma string alfanumérica; se o atributo é do tipo int, a biblioteca gera um número inteiro; se o atributo é do tipo boolean, a biblioteca gera um valor verdadeiro ou falso; e assim por diante. A biblioteca também suporta atributos que são outras classes, listas, enums ou interfaces.</span></div><h3><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Casos de teste</span></h3><div style="text-align: left;"><span style="font-family: Arial; font-size: 14pt; text-align: justify; white-space-collapse: preserve;">Bons testes devem cobrir todos os ramos da lógica condicional. Isso nos dá mais confiança em nosso código e, muitas vezes, revela problemas que podemos ter esquecido. Embora nosso serviço seja muito simples, ele ainda apresenta alguns cenários que precisam ser cobertos.</span></div><div style="text-align: left;"><span style="font-family: Arial; font-size: 14pt; text-align: justify; white-space-collapse: preserve;"><br /></span></div><div style="text-align: justify;"><span id="docs-internal-guid-72769132-7fff-26a5-12ab-68297058d258"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Depois de criar os objetos Curso e Aluno com a biblioteca instancio, basta chamar o método matricularAluno e verificar se o resultado é o esperado. Para isso, podemos usar o Junit e as suas asserções. O teste ficaria assim:</span></span></div><div><span><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></div><div><span id="docs-internal-guid-21d4391f-7fff-9916-50c7-12476d1da593"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #4c81c9; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">@Test</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">public</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">void</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">testMatricularAluno</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">() {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="color: #738191; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">// Arrange</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> Curso curso = Instancio.instance(Curso.class);<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> Aluno aluno = Instancio.instance(Aluno.class);</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="color: #738191; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">// Act</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> Matricula matricula = curso.matricularAluno(aluno);</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="color: #738191; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">// Assert</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> assertNotNull(matricula);</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> assertEquals(curso, matricula.getCurso());</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> assertEquals(aluno, matricula.getAluno());</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p></td></tr></tbody></table></div></span></div><div><span><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></div><div style="text-align: justify;"><span id="docs-internal-guid-75453ecc-7fff-b748-589f-2602ec916a48"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Como podemos ver, a biblioteca instancio simplifica bastante a criação de testes unitários em Java, reduzindo a quantidade de código necessário e aumentando a legibilidade dos testes. A biblioteca instancio é gratuita e open source, e pode ser baixada no site <a href="http://www.instancio.org" target="_blank">www.instancio.org</a>. Recomendo que você experimente a biblioteca instancio e veja como ela pode melhorar a qualidade dos seus testes unitários.</span></span></div><div><span><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></div><div><h3><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Configurando o projeto</span></h3></div><div><span id="docs-internal-guid-e7828811-7fff-2eec-f44d-13a4c6d6ccd2"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Para usar a biblioteca instancio, você só precisa adicionar a dependência no seu projeto. Neste caso, estou utilizando maven:</span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">dependency</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span> </span><</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">groupId</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">org.instancio</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"></</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">groupId</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span> </span><</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">artifactId</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">instancio-core</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"></</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">artifactId</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span> </span><</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">version</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">2.16.1</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"></</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">version</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span> </span><</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">scope</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">test</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"></</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">scope</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"></</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">dependency</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-00bb2141-7fff-0e38-667a-50b3176b1ac7"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">A biblioteca instancio também suporta tipos genéricos, classes record e sealed, arrays e streams. Você pode criar coleções de objetos usando o método `ofList`:</span></span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">List</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">Aluno</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> alunos = Instancio.ofList(Aluno.class).size(10).create();</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-b61af278-7fff-0d66-e7e7-12d93fce3998"></span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><br /></p></span></div><div><span id="docs-internal-guid-b84eef48-7fff-7f99-6689-6162871032e2"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Ou criar tipos genéricos usando o `TypeToken`:</span></span></div><div><br /></div><div><span id="docs-internal-guid-4d5a82ea-7fff-b1ba-fe06-a4b7d818dfdf"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Pair<List<Foo>, List<Bar>> pairOfLists = Instancio.create(</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">new</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> TypeToken<Pair<List<Foo>, List<Bar>>>() {});</span></p></td></tr></tbody></table></div></span></div><div><span><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></div><div><h3><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Como personalizar os valores gerados</span></h3></div><div style="text-align: justify;"><span id="docs-internal-guid-89394179-7fff-3507-d2c3-429814bd4a2c"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Se você precisar personalizar os valores gerados pela biblioteca instancio, você pode usar vários métodos da API para isso. Por exemplo, você pode usar o método `generate` para definir um gerador customizado para um campo específico:</span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></div><div style="text-align: justify;"><span id="docs-internal-guid-55eccfbe-7fff-c8cf-5e2e-af4a43fbf580"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Pessoa pessoa = Instancio.of(Pessoa.class)</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.generate(field(Pessoa::getDataNascimento), gen -> gen.temporal().localDate().past())<span> </span><span> </span><span> </span></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.create();</span></p></td></tr></tbody></table></div><br /></span></div><div style="text-align: justify;"><span id="docs-internal-guid-e12c5db9-7fff-bcdb-da11-542cf706093d"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Esse código cria um objeto `Pessoa` com o campo `dataNascimento` gerado usando o gerador `gen.temporal().localDate().past()`, que retorna uma data passada aleatória.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Você também pode usar o método `set` para definir um valor fixo para um campo:</span></p><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-d36cf5d8-7fff-6676-11f1-fefc0cbb2637"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Pessoa pessoa = Instancio.of(Pessoa.class)</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.set(field(Pessoa::getNome), </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">"João"</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">)<span> </span><span> </span><span> </span><span> </span><span> </span></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.create();</span></p></td></tr></tbody></table></div></span></span></div></span></div><div style="text-align: justify;"><span><br /></span></div><div style="text-align: justify;"><span id="docs-internal-guid-f1e74176-7fff-e017-de40-4a1f57a534b2"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Esse código cria um objeto `Person` com o campo `firstName` definido como "João".</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Outro método útil é o `supply`, que permite fornecer um valor dinâmico para um campo usando um `Supplier`:</span></p><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></div><div style="text-align: justify;"><span id="docs-internal-guid-7a8ef1b3-7fff-a353-046a-95e4562953ef"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Pessoa pessoa = Instancio.of(Pessoa.class)</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.supply(all(LocalDate.class), () -> LocalDate.now())<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.create();</span></p></td></tr></tbody></table></div><br /></span></div><div style="text-align: justify;"><span id="docs-internal-guid-651fdf67-7fff-5655-5ffb-b4a2d7c322ee"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Esse código cria um objeto `Pessoa` com todos os campos do tipo `LocalDate` definidos como o momento atual.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Além disso, você pode usar o método `onComplete` para executar uma ação após a criação do objeto:</span></p><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Pessoa pessoa = Instancio.of(Pessoa.class)</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> .onComplete(all(Pessoa.class), (Pessoa p) -></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> p.setNome(p.getGenero() == Genero.MASCULINO ? </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">"João"</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"> : </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">"Maria"</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">))<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.create();</span></p></td></tr></tbody></table></div><br /></span></div></span></div></span></span><div style="text-align: justify;"><span><span><span id="docs-internal-guid-2902bdc0-7fff-f3d7-b13d-2143cfcdb2bd"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Esse código cria um objeto `Pessoa` e depois define o campo `nome` de acordo com o campo `genero`.</span></p></span><span><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></span></span><div><span><span><span><span style="font-family: Arial;"><h3 style="font-family: "Times New Roman"; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: -webkit-left; vertical-align: baseline; white-space-collapse: collapse;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Como criar modelos reutilizáveis de objetos</span></h3></span></span></span></span><div style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span id="docs-internal-guid-7415375f-7fff-10a5-0a3d-279219bf8e89" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span><span><span><span style="font-family: Arial;"><span style="font-family: Arial;"><p dir="ltr" style="font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; white-space-collapse: preserve;"><span id="docs-internal-guid-91f38011-7fff-6d61-8911-b3b7995abf51">Se você precisar criar vários objetos com características semelhantes, você pode usar o conceito de modelos (Models) da biblioteca instancio. Um modelo é uma forma de definir um template de objeto que pode ser reutilizado em diferentes testes.</span></p><p dir="ltr" style="font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; white-space-collapse: preserve;"><span><br /></span></p><p dir="ltr" style="font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; white-space-collapse: preserve;"><span style="font-size: 14pt;">Por exemplo, se você quiser criar objetos da classe `Pessoa` que representam membros da família Simpson, você pode criar um modelo assim:</span></p><p dir="ltr" style="font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; white-space-collapse: preserve;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></p><div align="left" dir="ltr" style="font-size: 14pt; margin-left: 0pt; white-space-collapse: preserve;"></div></span></span></span></span></span><span id="docs-internal-guid-2443b786-7fff-e615-7dbd-74c8bc5dbbc3"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 29.4504pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Model<Aluno> simpsons = Instancio.of(Aluno.class)</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.set(field(Aluno::getSobrenome), </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">"Simpson"</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">)</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.set(field(Endereco::getCidade), </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">"Springfield"</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">)</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.generate(field(Aluno::getDataNascimento), gen -> gen.temporal().localDate().past())<span> </span><span> </span><span> </span></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">.toModel();</span></p></td></tr></tbody></table></div></span><br /><span id="docs-internal-guid-6aca740f-7fff-a8df-0495-ced06d52f7e1"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Esse modelo define que todos os objetos `Aluno` criados a partir dele terão o sobrenome "Simpson", a cidade "Springfield" e uma idade entre 40 e 50 anos.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Depois, você pode criar objetos específicos usando esse modelo:</span></p><div><br /></div></span><span><span><span><span><span><div align="left" dir="ltr" style="font-family: Arial; font-size: 14pt; margin-left: 0pt; white-space-collapse: preserve;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Aluno homer = Instancio.of(simpsons)</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">.set(field(Aluno::getNome), </span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">"Homer"</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">)</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">.set(all(Genero.class), Genero.MASCULINO)<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">.create();</span></p></td></tr></tbody></table></div><p dir="ltr" style="font-family: Arial; font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; white-space-collapse: preserve;"><span id="docs-internal-guid-4129acad-7fff-85e8-f655-8a42ea2dc209"><br /></span></p><div align="left" dir="ltr" style="font-family: Arial; font-size: 14pt; margin-left: 0pt; white-space-collapse: preserve;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Aluno marge = Instancio.of(simpsons)</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">.set(field(Aluno::getNome), </span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #0048ab; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">"Marge"</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">)</span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">.set(all(Genero.class), Genero.FEMININO)<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span face="Consolas,sans-serif" style="background-color: #eaeef3; color: #00193a; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">.create();</span></p></td></tr></tbody></table></div><p dir="ltr" style="font-family: Arial; font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; white-space-collapse: preserve;"><br /></p><p dir="ltr" style="font-family: Arial; font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; white-space-collapse: preserve;"><span style="font-size: 14pt;">Esses códigos criam objetos `Aluno` que representam o Homer e a Marge, usando os valores definidos no modelo e sobrescrevendo os valores específicos de cada um.</span></p><p dir="ltr" style="font-family: Arial; font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; white-space-collapse: preserve;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></p><p dir="ltr" style="font-family: Arial; font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; white-space-collapse: preserve;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"></span></p><h3 style="font-family: "Times New Roman"; text-align: -webkit-left;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Principais recursos da biblioteca instancio</span></h3><div style="font-family: Arial;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">A biblioteca instancio possui vários recursos interessantes que facilitam a geração de dados de teste. Alguns deles são:</span></p></span></div><div style="font-family: Arial;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"></p><ul><li><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">Dados totalmente reproduzíveis em caso de falha nos testes. A biblioteca instancio usa uma semente (seed) para gerar os dados aleatórios, que pode ser especificada ou obtida pelo usuário. Assim, é possível reproduzir os mesmos dados que causaram a falha e corrigir o problema.</span></li><li>Suporte para anotações de validação de beans. A biblioteca instancio pode gerar dados que respeitam as anotações de validação de beans, como `@NotNull`, `@Size`, `@Email`, etc. Isso evita que os testes falhem por causa de dados inválidos.</li><li>Opções flexíveis de configuração. A biblioteca instancio permite configurar vários aspectos do comportamento da geração de dados, como o modo estrito ou leniente, a profundidade máxima, o mapeamento de subtipos, etc. Essas configurações podem ser feitas programaticamente ou usando um arquivo de propriedades.</li><li>Integração com JUnit Jupiter. A biblioteca instancio oferece uma extensão para JUnit Jupiter que facilita a reprodução de testes falhos, a injeção de configurações e a geração de argumentos para testes parametrizados.</li><li>Interface de provedor de serviço (SPI). A biblioteca instancio permite que o usuário crie e registre suas próprias implementações de interfaces como `GeneratorProvider`, `TypeResolver` e `TypeInstantiator`, para customizar ainda mais a geração de dados.</li></ul><p></p></span></div><p dir="ltr" style="font-family: Arial; font-size: 14pt; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; white-space-collapse: preserve;"><span><br /></span></p><h3 style="font-family: "Times New Roman"; text-align: -webkit-left;"><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Conclusão</span></h3><div><span style="font-family: Arial; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">Neste post, apresentei a biblioteca instancio, uma ferramenta poderosa para gerar dados de teste em Java. Mostrei como usar sua API simples e flexível para criar objetos totalmente populados com dados aleatórios, personalizar os valores gerados e criar modelos reutilizáveis de objetos. Eu também listei alguns dos principais recursos da biblioteca, que tornam a geração de dados mais fácil e confiável.</span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">Se você se interessou pela biblioteca instancio, você pode acessar o site</span><span style="color: black; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: none; vertical-align: baseline;"><a href="https://www.blogger.com/blog/post/edit/6448280182389226496/5563246939379068755#"> </a><a href="https://www.instancio.org/user-guide" target="_blank">https://www.instancio.org/user-guide</a></span><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"> para ver mais detalhes sobre sua documentação, exemplos e artigos. Você também pode contribuir com o projeto no GitHub:</span><a href="https://www.blogger.com/blog/post/edit/6448280182389226496/5563246939379068755#" style="text-decoration-line: none;"><span style="color: black; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"> https://github.com/instancio/instancio</span></a><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">. </span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">E como sempre, um exemplo de utilização no meu GitHub:</span><span style="color: black; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: none; vertical-align: baseline;"><a href="https://www.blogger.com/blog/post/edit/6448280182389226496/5563246939379068755#"> </a><a href="https://github.com/sandrogiacom/school-test" target="_blank">https://github.com/sandrogiacom/school-test</a></span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">Espero que você tenha gostado deste post e que a biblioteca instancio possa te ajudar a escrever testes melhores e mais concisos em Java. Até a próxima!</span></p></span></div><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências:</span></p><div class="separator" style="clear: both; orphans: 2; text-align: center; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; widows: 2;"><span id="docs-internal-guid-4237f195-7fff-a11a-bb54-93fc6b11121a"><p dir="ltr" style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-transform: none; white-space: normal; word-spacing: 0px;"><a href="https://www.instancio.org/getting-started/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">https://www.instancio.org/getting-started/</span></a></p><p dir="ltr" style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-transform: none; white-space: normal; word-spacing: 0px;"><a href="https://www.baeldung.com/java-test-data-instancio" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">https://www.baeldung.com/java-test-data-instancio</span></a></p><div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: left; text-transform: none; white-space: normal; word-spacing: 0px;"><br /></div></span></div><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: "Times New Roman"; text-align: left;"></span><span id="docs-internal-guid-2bd62336-7fff-3c3e-2cc4-b4f01563fae4" style="font-family: "Times New Roman"; text-align: left;"><br /></span></p><p dir="ltr" style="font-family: Arial; line-height: 1.656; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/U668llIYrYpJtwK80V9Q7wiomO1op3ZBGGXAne2mKqhC2nhjfnqL98sfNysuIT_GmG5YeOXiY6TZVizTaV4nGHpTo3gvpFrazKk0n0bPvJOSaZIFYuWU0lx32QqA2MTaVsizjYLFS_4tFGPYEzZKR-UUSXQHv-bJ1tSPvUFnX6rKB0dfAruzADGFZbLdqg" style="cursor: move; margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="font-family: Arial; line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><div style="font-family: Arial;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></div></span></span></span></span></span></span></div></div></div></div><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-6044408222934706382023-02-01T20:57:00.008-03:002023-02-01T21:12:14.827-03:00Conhecendo o serviço fly.io - Parte 1<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Conhecendo o serviço fly.io - Parte 1" name="twitter:title"></meta>
<meta content="Fly.io é uma plataforma de hospedagem em nuvem que fornece aos desenvolvedores um ambiente simplificado" name="twitter:description"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEfgeJJ4XBhTetN7eyO00r-yx0ktQc_sEZQu0_4LYWk6OrRnVCz5i47fjwpluVdKFI5OGmCw5thgBBscl-GzbRKNQL2T77WLfQtVXwgJJWEoneQymOC0v5SDEeUYr6JWk9F5iL0Exgna7ufR28qzNp9fltgYkPsE61Vn3FEFejhM6JolrfEWNcw3QZyQ/w400-h267/free-cloud-computing.png" name="twitter:image"></meta>
<span id="docs-internal-guid-1de36d3c-7fff-4290-fbcf-060a7c3fb888"><div class="separator"><img border="0" data-original-height="420" data-original-width="630" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEfgeJJ4XBhTetN7eyO00r-yx0ktQc_sEZQu0_4LYWk6OrRnVCz5i47fjwpluVdKFI5OGmCw5thgBBscl-GzbRKNQL2T77WLfQtVXwgJJWEoneQymOC0v5SDEeUYr6JWk9F5iL0Exgna7ufR28qzNp9fltgYkPsE61Vn3FEFejhM6JolrfEWNcw3QZyQ/s16000/free-cloud-computing.png" /></div><h1 dir="ltr" style="line-height: 1.56; margin-bottom: 6pt; margin-right: 8pt; margin-top: 0pt; text-align: center;"><span style="color: #222222; font-family: Arial; font-size: 23pt; white-space: pre-wrap;"><br /></span></h1><h1 dir="ltr" style="line-height: 1.56; margin-bottom: 6pt; margin-right: 8pt; margin-top: 0pt; text-align: center;"><span style="color: #222222; font-family: Arial; font-size: 23pt; white-space: pre-wrap;">Conhecendo o serviço fly.io - Parte 1</span></h1><h1 dir="ltr" style="line-height: 1.56; margin-bottom: 6pt; margin-right: 8pt; margin-top: 0pt; text-align: center;"></h1><br /><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://fly.io/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Fly.io</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">é uma plataforma de hospedagem em nuvem que fornece aos desenvolvedores um ambiente simplificado e altamente otimizado para hospedar seus aplicativos e sites. Ele oferece uma variedade de benefícios, incluindo maior desempenho, escalabilidade e segurança, tornando-o a escolha ideal para desenvolvedores que desejam criar e iniciar seus aplicativos de maneira rápida e fácil.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Isto aqui não é um patrocínio da plataforma</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, mas apenas uma ajuda para quem está procurando alguma hospedagem gratuita tal como era o </span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Heroku</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">No momento da escrita deste post, a plataforma não tem suporte ao </span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Java</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, porém é possível realizar um deploy utilizando uma imagem </span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Docker</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, onde vou demonstrar nos próximos posts. Abaixo pode-se conferir a lista de linguagens suportadas:</span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://fly.io/docs/languages-and-frameworks/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://fly.io/docs/languages-and-frameworks/</span></a></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 16pt; margin-top: 0pt;"><span style="color: #666666; font-family: Arial; font-size: 15pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Alguns dos principais recursos que Fly.io incluem:</span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Global CDN</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">: Fly.io utiliza uma rede global de entrega de conteúdo (CDN) rápida e eficiente para fornecer conteúdo de forma rápida e confiável para usuários em todo o mundo.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Escalabilidade</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">: Com o Fly.io, você pode facilmente escalar ou reduzir seu aplicativo conforme necessário, sem ter que se preocupar com os detalhes técnicos do gerenciamento de infraestrutura.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Integração fácil</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">: Fly.io integra-se facilmente com ferramentas e serviços populares, como GitHub, GitLab e Jenkins, para que você possa começar de forma rápida e fácil.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Otimização de desempenho</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">: Fly.io otimiza o desempenho do seu aplicativo, utilizando cache e outras técnicas para melhorar os tempos de resposta e reduzir a carga do servidor.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Segurança</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">: Fly.io leva a segurança a sério e fornece uma variedade de recursos e ferramentas para ajudar a manter seus aplicativos e dados seguros, incluindo criptografia, certificados Secure Socket Layer (SSL) e muito mais.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 16pt; margin-top: 0pt;"><span style="color: #666666; font-family: Arial; font-size: 15pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Quanto custa?</span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O custo do Fly.io varia de acordo com os serviços e recursos específicos exigidos pelo usuário. O Fly.io opera em um modelo de preços conforme uso (pay-as-you-go), em que os usuários são cobrados com base no uso da plataforma. Isso inclui fatores como a quantidade de tráfego, o número de funções sem servidor e a quantidade de armazenamento usado.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O Fly.io fornece uma calculadora de custos em seu site, permitindo que os usuários estimem o custo de seu uso. Também é possível receber um orçamento da equipe Fly.io entrando em contato diretamente com eles.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">É importante observar que o Fly.io oferece uma avaliação gratuita para novos usuários, permitindo que eles testem a plataforma e seus recursos antes de se comprometer com um plano pago. Isso oferece uma oportunidade para os usuários avaliarem a plataforma e determinarem se ela atende às suas necessidades.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 16pt; margin-top: 0pt;"><span style="color: #666666; font-family: Arial; font-size: 15pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Recursos gratuitos</span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Recursos incluídos gratuitamente em todos os planos:</span></p><br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Até 3 VMs de CPU compartilhada de 1x 256 MB*</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Armazenamento de volume persistente de 3 GB (total)</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Transferência de dados de saída de 160 GB</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">*Total de 3 VMs entre Aplicativos e Máquinas</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Não existe até o momento uma regra de tempo para utilizar os recursos gratuitos. Lembrando que para fazer o seu primeiro deploy, é necessário um cadastro e um </span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">cartão de crédito</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> válido</span></p><br /><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências:</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://fly.io/docs/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://fly.io/docs/</span></a></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://fly.io/docs/about/pricing/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://fly.io/docs/about/pricing/</span></a></p><div><br /></div></span><div class="separator" style="clear: both; text-align: center;"><br /></div><span id="docs-internal-guid-2bd62336-7fff-3c3e-2cc4-b4f01563fae4"><br /><p dir="ltr" style="line-height: 1.656; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/U668llIYrYpJtwK80V9Q7wiomO1op3ZBGGXAne2mKqhC2nhjfnqL98sfNysuIT_GmG5YeOXiY6TZVizTaV4nGHpTo3gvpFrazKk0n0bPvJOSaZIFYuWU0lx32QqA2MTaVsizjYLFS_4tFGPYEzZKR-UUSXQHv-bJ1tSPvUFnX6rKB0dfAruzADGFZbLdqg" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><br /><br /></span><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-36387128708932074212023-01-29T18:15:00.003-03:002023-01-29T18:23:10.985-03:00AWS Lambda kickstarts Java functions<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="AWS Lambda kickstarts Java functions" name="twitter:title"></meta>
<meta content="O AWS Lambda SnapStart reduz o tempo de inicialização do Java iniciando as funções antecipadamente" name="twitter:description"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://lh3.googleusercontent.com/Uhn-89rrXP3wo1JDreC4Y0X3dYQQIHFQEfyK3auOrGwLa0M4B0jGMjAjNH1m4CR6-jI2HOVwqYnmtqgXONnhDdOmrRpXQlBR5PFwOR91LhD19N1YM7NIWrKc2I-unAvvbUgvc7NtQr3Mgd8PC8kOz-FLR6v-A1LyFJjoPsjV5htD4aaOeqexiOtO3yvx5g" name="twitter:image"></meta>
<p> </p><span id="docs-internal-guid-2bd62336-7fff-3c3e-2cc4-b4f01563fae4"><h1 dir="ltr" style="line-height: 1.56; margin-bottom: 6pt; margin-right: 8pt; margin-top: 0pt; text-align: center;"><span style="color: #222222; font-family: Arial; font-size: 23pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">AWS Lambda kickstarts Java functions</span></h1><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 190px; overflow: hidden; width: 212px;"><img height="190" src="https://lh3.googleusercontent.com/Uhn-89rrXP3wo1JDreC4Y0X3dYQQIHFQEfyK3auOrGwLa0M4B0jGMjAjNH1m4CR6-jI2HOVwqYnmtqgXONnhDdOmrRpXQlBR5PFwOR91LhD19N1YM7NIWrKc2I-unAvvbUgvc7NtQr3Mgd8PC8kOz-FLR6v-A1LyFJjoPsjV5htD4aaOeqexiOtO3yvx5g" style="margin-left: 0px; margin-top: 0px;" width="212" /></span></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O AWS Lambda SnapStart reduz o tempo de inicialização do Java iniciando as funções antecipadamente e armazenando em cache uma foto (snapshot) do ambiente de execução já inicializado.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A AWS revelou o AWS Lambda SnapStart para Java, uma otimização de desempenho destinada a facilitar a criação de aplicativos Java responsivos e escaláveis usando o AWS Lambda, o serviço de computação sem servidor e orientado a eventos na nuvem da Amazon.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Apresentado em 28 de novembro de 2022, o AWS Lambda SnapStart para Java melhora os tempos de inicialização iniciando o código de uma função antecipadamente (ahead of time), obtendo um acesso instantâneo ao ambiente de execução inicializado e armazenando-o em cache. Quando a função é invocada e dimensionada, o SnapStart retoma novos ambientes de execução a partir do instantâneo armazenado em cache, em vez de precisar inicializá-los do zero, melhorando assim a latência de inicialização, disse a AWS.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Elaborando seu raciocínio para o serviço, a AWS disse que, para aplicativos sensíveis à latência, nos quais os usuários desejam oferecer suporte a rajadas imprevisíveis de tráfego, longas latências de inicialização podem afetar negativamente a experiência do usuário. O AWS Lambda SnapStart é ideal para aplicativos como microsserviços interativos, processamento de dados ou APIs síncronas.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os usuários podem ativar o Lambda SnapStart para funções Lambda novas ou existentes baseadas em Java em execução no Amazon Corretto 11 por meio da API AWS Lambda, Console de gerenciamento da AWS, AWS Command Line Interface e outros recursos da AWS.</span></p><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O Lambda SnapStart está disponível nas seguintes regiões da AWS: Leste dos EUA (Ohio), Leste dos EUA (N. da Virgínia), Oeste dos EUA (Oregon), Ásia-Pacífico (Cingapura), Ásia-Pacífico (Tóquio), Ásia-Pacífico (Sydney), Europa (Frankfurt), Europa (Irlanda) e Europa (Estocolmo). </span></p><br /><br /><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências:</span></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://www.infoworld.com/article/3681549/aws-lambda-kickstarts-java-functions.html" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://www.infoworld.com/article/3681549/aws-lambda-kickstarts-java-functions.html</span></a></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://aws.amazon.com/pt/about-aws/whats-new/2022/11/aws-lambda-snapstart-java-functions/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://aws.amazon.com/pt/about-aws/whats-new/2022/11/aws-lambda-snapstart-java-functions/</span></a></p><p dir="ltr" style="line-height: 1.9872; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://aws.amazon.com/pt/blogs/aws/new-accelerate-your-lambda-functions-with-lambda-snapstart/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://aws.amazon.com/pt/blogs/aws/new-accelerate-your-lambda-functions-with-lambda-snapstart/</span></a></p><br /><br /><p dir="ltr" style="line-height: 1.656; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/U668llIYrYpJtwK80V9Q7wiomO1op3ZBGGXAne2mKqhC2nhjfnqL98sfNysuIT_GmG5YeOXiY6TZVizTaV4nGHpTo3gvpFrazKk0n0bPvJOSaZIFYuWU0lx32QqA2MTaVsizjYLFS_4tFGPYEzZKR-UUSXQHv-bJ1tSPvUFnX6rKB0dfAruzADGFZbLdqg" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><br /><br /></span><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-7122153237363251332023-01-01T12:00:00.001-03:002023-01-01T12:00:00.181-03:00Eclipse Migration Toolkit for Java<p> <span style="font-family: Arial; font-size: 26pt; white-space: pre-wrap;">Eclipse Migration Toolkit for Java (EMT4J) simplifica a atualização de aplicativos Java</span></p><span id="docs-internal-guid-9d080097-7fff-5d73-1c3c-707cfa4d9a66"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A Adoptium </span><a href="https://adoptium.net/blog/2022/12/emt4j-an-easier-upgrade-for-java-applications" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">apresentou</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> o Eclipse Migration Toolkit for Java (EMT4J), um </span><a href="https://projects.eclipse.org/projects/adoptium.emt4j" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">projeto Eclipse</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> de software livre capaz de analisar e atualizar aplicativos do Java 8 para o Java 11 e do Java 11 para o Java 17. O EMT4J suportará a atualização para futuras versões LTS.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">As organizações aconselham manter o Java runtime atualizado para obter segurança e melhorias funcionais. Enquanto isso, as versões Java Long Term Support (LTS) serão lançadas a cada dois anos e projetos como o </span><a href="https://www.infoq.com/news/2022/11/spring-6-spring-boot-3-launch/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Spring Framework 6</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> agora requerem o Java 17. Infelizmente, a adoção de novas versões Java é relativamente lenta. Por exemplo, em 2022, quatro anos após seu lançamento, o Java 11 foi </span><a href="https://newrelic.com/resources/report/2022-state-of-java-ecosystem" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">usado</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> por menos de 49% dos aplicativos Java.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Atualizar um aplicativo para uma nova versão do Java significa que os desenvolvedores precisam resolver todos os problemas introduzidos pelas alterações e remoções dentro do Java. Isso inclui funcionalidades como a remoção dos pacotes Nashorn, J2EE e Java, uma alteração nas APIs e acesso aos componentes internos do Java que se tornaram mais restritos.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O EMT4J oferece um plugin Maven (</span><a href="https://github.com/adoptium/emt4j/issues/13" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">ainda não disponível </span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">na central Maven), agente Java e solução de linha de comando para analisar incompatibilidades de projetos com novas versões Java e a saída é gravada nos formatos </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">TXT, JSON</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> ou </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">HTML</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Para demonstrar o EMT4J, considere o seguinte aplicativo de exemplo que faz uma chamada para o método </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Thread.stop()</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> que foi removido no Java 11:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Thread thread = </span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Thread();</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">thread.stop();</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Depois de clonar o </span><a href="https://github.com/adoptium/emt4j" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">repositório</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Git e </span><a href="https://github.com/adoptium/emt4j#how-to-build" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">configurar</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> as cadeias de ferramentas Maven para JDK 8 e JDK 11, o projeto pode ser construído com:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">mvn clean </span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">package</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> -Prelease</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 6pt; margin-top: 6pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Isso resulta em um arquivo</span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> .zip</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> no diretório </span><span style="font-family: Arial; font-size: 12pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">emt4j-assembly/target</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> que pode ser extraído. Dentro do diretório extraído, a análise pode ser iniciada. Por exemplo, na </span><a href="https://github.com/adoptium/emt4j#use-the-command-line-toolstatically-scan" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">linha de comando</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">:</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">java -cp </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">"lib/analysis/*"</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> org.eclipse.emt4j.analysis.AnalysisMain -f 8 -t 17 </span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> -o java8to17.html /home/user/application/classes</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Isso analisa os arquivos de classe no diretório especificado e exibe possíveis problemas ao atualizar do Java 8 para o Java 17 no arquivo </span><span style="font-family: Arial; font-size: 12pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">java8to17.html</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. Alternativamente, os scripts </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.bat</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> ou </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.sh</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> no diretório bin do arquivo extraído podem ser usados para iniciar a análise da linha de comando. O arquivo </span><a href="https://github.com/adoptium/emt4j#use-the-command-line-toolstatically-scan" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">README</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> descreve todas as opções disponíveis para analisar classes e arquivos JAR.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O arquivo HTML resultante exibe a descrição, resolução e localização do problema:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">1.1 Removed API Back to Content</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">1.1.1 Description</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Many of these APIs were deprecated in previous releases and </span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> have been replaced by newer APIs.</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">1.1.2 How to fix</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">See corresponding JavaDoc.</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">1.1.3 Issues Context</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Location: file:/home/user/application/classes/App.class, </span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Target: java.lang.Thread.stop()V</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como alternativa, o </span><a href="https://github.com/adoptium/emt4j#use-the-emt4j-agent" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">agente EMT4J</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> pode ser usado ao iniciar um aplicativo Java ou o </span><a href="https://github.com/adoptium/emt4j#use-it-as-maven-plugin" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">plugin Maven</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> ao criar o projeto.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O projeto contém conjuntos de regras para atualização de </span><a href="https://github.com/adoptium/emt4j/blob/master/emt4j-common/src/main/resources/default/rule/8to11/rule.xml" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Java 8 para 11</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> e de </span><a href="https://github.com/adoptium/emt4j/blob/master/emt4j-common/src/main/resources/default/rule/11to17/rule.xml" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Java 11 para 17</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. Por exemplo, a regra de </span><a href="https://github.com/adoptium/emt4j/blob/master/emt4j-common/src/main/resources/default/rule/8to11/rule.xml" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">API interna</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> do JDK é usada para verificar se um aplicativo usa os componentes internos do JDK:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">rule</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> desc="JDK internal API" type="reference-class" </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> match-type="by-package" class-package-file="jdk_internals.cfg"</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> result-code="JDK_INTERNAL" must-contain-in-bytecode="true"</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> sub-result-code="@{subResultCode}" priority="p4"></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">support-modes</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">mode</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">agent</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"></</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">mode</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">mode</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"></</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">mode</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"></</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">support-modes</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"></</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">rule</span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">></span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">modos de suporte (modes)</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> indicam se a regra pode ser usada com o modo de </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">agente(agent)</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> e/ou por meio da análise estática, modo de </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">classe(class)</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, com a linha de comando ou plugin Maven. Os pacotes de recursos de tradução são vinculados por meio do</span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> resultado do código</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, neste caso, JDK_INTERNAL, que mapeia para os arquivos de tradução </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">JDK_INTERNAL.properties</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> e </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">JDK_INTERNAL_zh.properties</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> dentro do diretório </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">emt4j-common/src/main/resources/default/i18n.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O EMT4J verifica o aplicativo em busca de pacotes e classes como </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">sun.nio</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> e </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">sun.reflect</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> definidos no arquivo de pacote de classe </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">jdk_internals.cfg</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> no diretório </span><span style="font-family: Arial; font-size: 12pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">emt4j-common/src/main/resources/default/rule/8to11/data/</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A classe de referência do tipo de regra real está localizada dentro do diretório </span><span style="font-family: Arial; font-size: 12pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">emt4j-common/src/main/java/org/eclipse/emt4j/common/rule/impl</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, pois a regra interna do JDK possui </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">modes</span><span style="background-color: white; color: #222222; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">agent</span><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: white; color: #222222; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">e </span><span style="background-color: #d0e0e3; font-family: "Courier New"; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: white; color: #222222; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #4c81c9; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">@RuleImpl</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">(type = </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">"reference-class"</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">ReferenceClassRule</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">extends</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="color: #0048ab; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">ExecutableRule</span><span style="color: #00193a; font-family: Consolas, sans-serif; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> {</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">As regras existentes podem oferecer inspiração para adicionar regras personalizadas seguindo as instruções no arquivo </span><a href="https://github.com/adoptium/emt4j#add-a-new-rule" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">README</span></a><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><br /><p dir="ltr" style="line-height: 1.9871999999999999; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Fontes (Em Inglês):</span></p><br /><p dir="ltr" style="line-height: 1.9871999999999999; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://www.infoq.com/news/2022/12/eclipse-migration-toolkit-java" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://www.infoq.com/news/2022/12/eclipse-migration-toolkit-java</span></a></p><br /><br /><p dir="ltr" style="line-height: 1.656; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/l5LSXKs8gt_UQvfvWDfgZ7iiyvh3PnJM2p9uBnpF0Awv3itDOxSqWFvw_l5m5Jf40XEyu402HrR508p2yVN1lINbn_kSdNHtIgcxLWYn_NPe8QMRoKScvrbMxLomcrETpSdsfqVcTY8MM6wxDuPkFEH7bkmsL5elHoZvM1SoEauwmOKeHti3bqQVn6BGVw" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><br /><br /></span><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-91522542670411717282022-09-10T10:32:00.000-03:002022-09-10T10:32:59.957-03:00O suporte de longo prazo e o que o LTS significa para o ecossistema Java<meta content="summary" name="twitter:card"></meta>
<meta content="O suporte de longo prazo e o que o LTS significa para o ecossistema Java" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj8NqKuwH4wvXN4mBfAnxWGtKvP8pDvgOkJqvilx_M29J_oRPaVThuyuFhg8LTQydEQt6I9H0DrIyfN6TPbc1_uJTVMW_72kTFD130TvgpuNFZ3cwu1QiMeKQMC1yuk-KcWOg_xZJQMx_hS6WattUEQCtU9PMPSlGyU3qMjTR_V8cYR2DHPdbGolfeYQA" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="435" data-original-width="975" height="286" src="https://blogger.googleusercontent.com/img/a/AVvXsEj8NqKuwH4wvXN4mBfAnxWGtKvP8pDvgOkJqvilx_M29J_oRPaVThuyuFhg8LTQydEQt6I9H0DrIyfN6TPbc1_uJTVMW_72kTFD130TvgpuNFZ3cwu1QiMeKQMC1yuk-KcWOg_xZJQMx_hS6WattUEQCtU9PMPSlGyU3qMjTR_V8cYR2DHPdbGolfeYQA=w640-h286" width="640" /></a></div></h1><h1>A arte do suporte de longo prazo e o que o LTS significa para o ecossistema Java</h1>
<h2>Aqui está o que o Java 17 tem em comum com o Java 11 e o Java 8.</h2>
<p>Em junho de 2018, há pouco mais de três anos, a Oracle e outros participantes do ecossistema Java anunciaram uma mudança no modelo de cadência de lançamento para Java SE.</p>
<p>Em vez de ter um lançamento principal planejado a cada dois ou quatro anos (que geralmente se torna de três a quatro anos), um novo modelo de lançamento de recursos de seis meses seria usado: a cada três anos, um lançamento seria designado como <strong>Long-Term Support (LTS)</strong> e receba apenas atualizações trimestrais de segurança, estabilidade e desempenho. Esse padrão foi emprestado descaradamente do modelo de lançamento do Mozilla Firefox, mas o ajustou para ficar mais alinhado com os requisitos de uma plataforma de desenvolvimento.</p>
<p>A primeira versão do Java lançada sob esse modelo foi o Java SE 11.</p>
<p>O lançamento do Java SE 17, o segundo lançamento do LTS sob o novo modelo, é iminente, e este artigo fornecerá uma atualização sobre como os lançamentos do Java SE funcionam. Também oferecerei alguns comentários sobre o que funcionou bem nos últimos três anos e quais refinamentos adicionais você deve esperar daqui para frente.</p>
<p>[Em 14 de setembro de 2021, a <a href="https://blogs.oracle.com/java/post/moving-the-jdk-to-a-two-year-lts-cadence">Oracle propôs mudar</a> a cadência dos lançamentos do JDK LTS de três em três anos para dois em dois anos. Se aceito, isso significa que a próxima versão do JDK LTS após o JDK 17 será o JDK 21, em vez do JDK 23. —Ed.]</p>
<h2>O modelo de lançamento de recursos de seis meses</h2>
<p>No modelo de lançamento de recursos, os desenvolvedores da plataforma Java podem trabalhar em recursos e lançá-los em qualquer período de seis meses, mas somente quando os recursos estiverem prontos. Compare isso com o antigo modelo de lançamento principal legado, onde os desenvolvedores da plataforma Java sentiram uma enorme pressão para empurrar recursos para um lançamento; caso contrário, teriam que esperar vários anos pelo próximo ciclo.</p>
<p>Enquanto isso, os desenvolvedores de aplicativos agora desfrutam de uma cadência constante de recursos pequenos em uma linha do tempo previsível. Isso é muito melhor do que ter desenvolvedores Java tentando consumir centenas de alterações de uma só vez a cada poucos anos.</p>
<p>Tem funcionado? Três anos no novo modelo, pesquisas com desenvolvedores mostram que entre um quarto e meio dos desenvolvedores usam a versão Java mais recente de seis meses como sua versão do dia-a-dia. Metade deles disse ter aplicativos em produção na versão mais recente.</p>
<p>E o resto?</p>
<p>É bem entendido e esperado que nem todos os desenvolvedores ou organizações queiram consumir lançamentos de recursos em uma cadência de seis meses. Organizações mais conservadoras, especialmente, querem solidificar uma pilha de desenvolvimento em torno de uma única versão e não assumir riscos associados à introdução de novos recursos. É aqui que as versões<strong> Java LTS</strong> entram em jogo.</p>
<h2>LTS se concentra na estabilidade</h2>
<p>As versões Java LTS, como<strong> Java 11 e Java 17</strong>, são semelhantes às versões de suporte estendido do Firefox. As atualizações da Oracle para as versões Java LTS fornecem apenas melhorias de estabilidade, segurança e desempenho, não novos recursos. Isso reduz o risco de que uma atualização possa interromper a interação com uma ferramenta ou biblioteca. As organizações podem contar com lançamentos Java LTS disponíveis por pelo menos oito anos, proporcionando tempo suficiente para que as cadeias de ferramentas se solidifiquem e para que os desenvolvedores façam a transição para outro LTS vários anos depois.</p>
<p>O modelo LTS permite que os provedores de tecnologia se concentrem em versões específicas no suporte de longo prazo de seus produtos. Afinal, seria impraticável esperar que provedores de plataforma e cadeias de ferramentas fornecessem vários anos de suporte a cada lançamento de recurso de seis meses. Muito rapidamente haveria dezenas de versões precisando de suporte, bem como uma base de usuários fragmentada que seria impraticável de gerenciar.</p>
<p>O momento ideal para versões que recebem o tratamento LTS é subjetivo. Historicamente, se você olhar para trás, do Java 1.2 ao Java 8, havia três a quatro anos entre os principais lançamentos. O novo modelo de lançamento de recursos tem três anos entre o Java 11 e o Java 17. Para organizações muito conservadoras, esse intervalo de três anos é ideal, mas à medida que mais desenvolvedores usam ferramentas e técnicas modernas, há uma demanda crescente para que a Oracle ofereça versões Java LTS em um ciclo mais curto, talvez a cada dois anos.</p>
<p>Sejamos claros: cada provedor de binários da plataforma Java oferece seus próprios cronogramas e ofertas de suporte. O padrão na Oracle é que haverá oito anos de suporte para uma versão Java SE LTS. Para o<strong> Java 8</strong>, o <strong>LTS </strong>já foi estendido até pelo menos <strong>2030</strong>, o que significa que esta versão terá pelo menos 16 anos de suporte quando for finalmente aposentada!</p>
<p>Enquanto isso, versões como Java 7 e Java 11 provavelmente não terão extensões de suporte. As extensões são baseadas simplesmente na adoção e se as organizações que fornecem os respectivos binários consideram valioso continuar oferecendo suporte (comercial).</p>
<h2>Conclusão</h2><p>
As versões LTS atuais do Java são Java 7, Java 8, Java 11 e 17. Java 11 e Java 17 foram lançados sob a nova cadência de lançamento de recursos e com exatamente três anos de diferença; Java 7 e Java 8 são do modelo de versão principal legado. O suporte ainda é o mesmo, com cada versão LTS do Java recebendo apenas atualizações de desempenho, estabilidade e segurança.</p>
<p>A Oracle pretende oferecer suporte às versões Java LTS da seguinte forma:</p>
<ul>
<li>Java 7 até 2022</li>
<li>Java 8 até pelo menos 2030</li>
<li>Java 11 até 2026</li>
<li>Java 17 até pelo menos 2029</li>
</ul>
<p>A Oracle quer que desenvolvedores e organizações tenham o melhor dos dois mundos: somente você pode decidir se faz sentido acompanhar os lançamentos de seis meses e digerir novos recursos regularmente ou implantar em uma versão LTS específica por um longo período . As organizações, é claro, podem misturar e combinar sua abordagem, por exemplo, mantendo a cadência de seis meses durante o desenvolvimento, mas bloqueando uma versão LTS quando o código estiver em produção.</p>
<h3 style="text-align: left;">Referências</h3><p><a href="https://blogs.oracle.com/javamagazine/post/java-long-term-support-lts?_x_tr_sl=pt&_x_tr_tl=en&_x_tr_hl=pt-BR&_x_tr_pto=wapp">https://blogs.oracle.com/javamagazine/post/java-long-term-support-lts?_x_tr_sl=pt&_x_tr_tl=en&_x_tr_hl=pt-BR&_x_tr_pto=wapp</a></p><p> </p><div><div><p dir="ltr" style="line-height: 1.656; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh5.googleusercontent.com/lmoqvd5N1g7Y5CMit4420jWQwgwr-jvTtfcBLR8p5lFVRkJvfBYmhIkEjIyn3RkVIKsvEFnubDsK-XEGdWsSCgPkJ-PW3kL45qwKF5r2imYQQJWKyXWfQZQu9INuZ4P1RmNEkzlNsA_apRuKilI6MugOt6tFL1TBIa1unXQtQgi9GRNKfcJlTd0i8A" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><p><br /><br /></p></div></div>
<div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-73912179893204327322022-09-09T01:30:00.006-03:002022-09-09T01:46:35.700-03:00Java 8 ao 18: Mudanças mais importantes na plataforma Java<meta content="summary" name="twitter:card"></meta>
<meta content="Java 8 ao 18: Mudanças mais importantes na plataforma Java" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://lh5.googleusercontent.com/smdEPyaGBXZshp6iSdZ22j9aiddt9hljF3eguXLncPAIXn16w_SiKp5iVcwJ0W20_2riOttHp9qBoMtJvh-Yksmg3Hq92RhYKKdC0cjOWy9DAm7m3UrbCDMtTsMdgXx11LE4JjmZusKuED74mAfCK3wIj0hDfNjbYt4GV_DLhy23Z8OTYfF62Zknbg" name="twitter:image"></meta>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 32pt; margin-right: 20pt; margin-top: 12pt; text-align: center;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 202px; overflow: hidden; width: 300px;"><img height="202" src="https://lh5.googleusercontent.com/smdEPyaGBXZshp6iSdZ22j9aiddt9hljF3eguXLncPAIXn16w_SiKp5iVcwJ0W20_2riOttHp9qBoMtJvh-Yksmg3Hq92RhYKKdC0cjOWy9DAm7m3UrbCDMtTsMdgXx11LE4JjmZusKuED74mAfCK3wIj0hDfNjbYt4GV_DLhy23Z8OTYfF62Zknbg" style="margin-left: 0px; margin-top: 0px;" width="300" /></span></span></p>
<p><span style="font-weight: 400;"> </span></p>
<h1><span style="font-weight: 400;">Vamos rever muitas das mudanças mais importantes na plataforma Java que aconteceram entre a versão 8 (2014) e 18 (2022)</span></h1>
<p> </p>
<p><span style="font-weight: 400;">O Java 8 foi lançado em março de 2014 e o Java 18 em março de 2022. São 8 anos de progresso, 203 JEPs (JDK Enhancement Proposals ), entre essas duas versões. Neste post, revisaremos as mudanças mais importantes e discutiremos os benefícios e desafios da adoção de versões mais recentes do JDK para novos aplicativos e para os mais antigos compilados com versões mais antigas.</span></p>
<p><span style="font-weight: 400;">Desde a versão 9, o Java tem novos recursos a cada 6 meses e é muito difícil acompanhar essas novas mudanças. A maioria das informações na internet descreve as mudanças entre as duas últimas versões do Java. No entanto, se você estiver em uma situação semelhante à minha, não está usando uma das versões mais recentes do Java, mas uma das várias versões anteriores (Geralmente 8 ou 11 que são as versões de suporte estendido).</span></p>
<p><span style="font-weight: 400;">Então é útil saber quais novos recursos foram adicionados desde a versão que você usa agora, ou entre as versões que você usa agora e aquela que você deseja começar a usar em seguida. Portanto, compilei uma tabela com todos os novos recursos adicionados desde o Java 8 para cada nova versão do Java.</span></p>
<p><span style="font-weight: 400;">Abaixo você encontra tabelas para:</span></p>
<ul>
<li aria-level="1" style="font-weight: 400;"><span style="font-weight: 400;">Novos recursos da linguagem Java – adições à linguagem Java ou APIs</span></li>
<li aria-level="1" style="font-weight: 400;"><span style="font-weight: 400;">Novas ferramentas e recursos no OpenJDK – adições fora da linguagem, como ferramentas de linha de comando ou melhorias na JVM</span></li>
<li aria-level="1" style="font-weight: 400;"><span style="font-weight: 400;">Recursos e APIs obsoletos/removidos</span></li>
</ul>
<p><span style="font-weight: 400;">Observe que não inclui todos os novos recursos e adições de API, apenas aqueles que são úteis para a maioria dos desenvolvedores, para manter a lista curta.</span></p>
<p><span style="font-weight: 400;">Este artigo não é sobre como escolher a versão Java certa para você usar. Mas vou pelo menos resumir todas as versões do Java desde o Java 8 e para sua conveniência:</span></p>
<ul>
<li aria-level="1" style="font-weight: 400;"><span style="font-weight: 400;">Java 8 – versão LTS (Long Term Support), última versão LTS antes do JPMS (módulos) serem introduzidos no Java 9</span></li>
<li aria-level="1" style="font-weight: 400;"><span style="font-weight: 400;">Java 11 – versão LTS</span></li>
<li aria-level="1" style="font-weight: 400;"><span style="font-weight: 400;">Java 17 – versão LTS, a versão LTS mais recente até março de 2023</span></li>
<li aria-level="1" style="font-weight: 400;"><span style="font-weight: 400;">Java 18 – versão não LTS, a versão mais recente em março de 2022</span></li>
<li aria-level="1" style="font-weight: 400;"><span style="font-weight: 400;">Todas as outras versões Java – versões não LTS</span></li>
</ul>
<p><span style="font-weight: 400;">Na maioria dos casos, você deve usar apenas versões LTS em produção. Isso é, a menos que você tenha necessidades específicas para usar o maior e a mais recente versão e esteja disposto a atualizar para uma nova versão do Java a cada 6 meses. Para saber mais sobre as versões do Java LTS, você pode ler </span><a href="https://blogs.oracle.com/javamagazine/post/java-long-term-support-lts"><span style="font-weight: 400;">A arte do suporte de longo prazo e o que o LTS significa para o ecossistema Java da Oracle</span></a><span style="font-weight: 400;"> (Em Inglês).</span></p>
<h2><span style="font-weight: 400;">Novos recursos da linguagem Java desde o Java 8</span></h2>
<p> </p>
<table border="1" cellpadding="1" cellspacing="1" style="height: 100%; margin-left: auto; margin-right: auto; width: 100%;">
<tbody>
<tr style="height: 64px;">
<td style="height: 64px; width: 491.734px;">
<p><strong>Feature</strong></p>
</td>
<td style="height: 64px; width: 81.1094px;">
<p><strong>Desde</strong></p>
</td>
<td style="height: 64px; width: 92.1562px;">
<p><strong>Preview desde</strong></p>
</td>
</tr>
<tr style="height: 194px;">
<td style="height: 194px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/408"><span style="font-weight: 400;">Simple Web Server </span></a><span style="font-weight: 400;">(a.k.a </span><a href="https://docs.oracle.com/en/java/javase/18/docs/api/jdk.httpserver/com/sun/net/httpserver/SimpleFileServer.html"><span style="font-weight: 400;">com.sun.net.httpserver.SimpleFileServer</span></a><span style="font-weight: 400;">)</span></p>
<p><span style="font-family: courier; font-weight: 400;">Java API:</span></p>
<p><span style="font-family: courier; font-weight: 400;">SimpleFileServer.createFileServer(new InetSocketAddress(9000), path, logLevel).start();</span></p>
<p><span style="font-family: courier; font-weight: 400;">Cmd Line: jwebserver -p 9000</span></p>
</td>
<td style="height: 194px; width: 81.1094px;">
<p><span style="font-weight: 400;">18</span></p>
</td>
<td style="height: 194px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 128px;">
<td style="height: 128px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/413"><span style="font-weight: 400;">Code Snippets in Java API Documentation</span></a></p>
<p><span style="font-family: courier; font-weight: 400;">{@snippet : lines of code} instead of <pre>{@code lines of code }</pre></span></p>
</td>
<td style="height: 128px; width: 81.1094px;">
<p><span style="font-weight: 400;">18</span></p>
</td>
<td style="height: 128px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 96px;">
<td style="height: 96px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/400"><span style="font-weight: 400;">UTF-8 by Default</span></a><span style="font-weight: 400;"> – em vez do charset definido pelo sistema..</span></p>
<p><span style="font-weight: 400;">Rode </span><span style="font-weight: 400;">javac -encoding UTF-8</span><span style="font-weight: 400;"> com JDK 8-17 para verificar problemas de codificação de código Java.</span></p>
</td>
<td style="height: 96px; width: 81.1094px;">
<p><span style="font-weight: 400;">18</span></p>
</td>
<td style="height: 96px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 118px;">
<td style="height: 118px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/415"><span style="font-weight: 400;">Context-Specific Deserialization Filters</span></a><span style="font-weight: 400;"> – Permitir que os aplicativos configurem filtros de desserialização, especifique um padrão por meio de uma propriedade do sistema ou uma fábrica de filtros por meio de uma propriedade do sistema ou por meio de ObjectInputFilter.Config</span></p>
</td>
<td style="height: 118px; width: 81.1094px;">
<p><span style="font-weight: 400;">17</span></p>
</td>
<td style="height: 118px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 454px;">
<td style="height: 454px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/420"><span style="font-weight: 400;">Pattern Matching for switch</span></a><span style="font-weight: 400;"> – como instanceof para switch; switch é uma expressão e pode ser atribuída:</span></p>
<p><span style="font-family: courier; font-weight: 400;">String result = switch (o) {</span></p><p><span style="font-family: courier;"> case null -> null;</span></p>
<p><span style="font-family: courier; font-weight: 400;"> case 0 -> throw new RuntimeException("Cannot be 0"); // Special cases</span></p>
<p><span style="font-family: courier; font-weight: 400;"> case Integer i && i > 0 -> "Positive number";</span></p>
<p><span style="font-family: courier; font-weight: 400;"> case Integer i -> "Negative number"; // 0 and positive numbers handled by above rules</span></p>
<p><span style="font-family: courier; font-weight: 400;"> case String s -> s;</span></p>
<p><span style="font-family: courier; font-weight: 400;"> case Point p -> p.toString();</span></p>
<p><span style="font-family: courier; font-weight: 400;"> case int[] ia -> "Array length" + ia.length;</span></p>
<p><span style="font-family: courier; font-weight: 400;"> default -> "Something else";</span></p>
<p><span style="font-family: courier; font-weight: 400;">}</span></p>
</td>
<td style="height: 454px; width: 81.1094px;"> </td>
<td style="height: 454px; width: 92.1562px;">
<p><span style="font-weight: 400;">17</span></p>
</td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/419"><span style="font-weight: 400;">Foreign Function & Memory API</span></a><span style="font-weight: 400;"> (uma alternativa ao JNI)</span></p>
</td>
<td style="height: 46px; width: 81.1094px;"> </td>
<td style="height: 46px; width: 92.1562px;">
<p><span style="font-weight: 400;">16</span></p>
</td>
</tr>
<tr style="height: 64px;">
<td style="height: 64px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/417"><span style="font-weight: 400;">Vector API</span></a><span style="font-weight: 400;"> – Cálculos expressos que compilam para instruções de hardware ideais</span></p>
</td>
<td style="height: 64px; width: 81.1094px;"> </td>
<td style="height: 64px; width: 92.1562px;">
<p><span style="font-weight: 400;">16</span></p>
</td>
</tr>
<tr style="height: 128px;">
<td style="height: 128px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/409"><span style="font-weight: 400;">Sealed classes</span></a><span style="font-weight: 400;"> (herança apenas para classes permitidas):</span></p>
<p><span style="font-family: courier; font-weight: 400;">public abstract sealed class Shape permits Circle, Rectangle, Square {...}</span></p>
</td>
<td style="height: 128px; width: 81.1094px;">
<p><span style="font-weight: 400;">17</span></p>
</td>
<td style="height: 128px; width: 92.1562px;">
<p><span style="font-weight: 400;">15</span></p>
</td>
</tr>
<tr style="height: 128px;">
<td style="height: 128px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/395"><span style="font-weight: 400;">Record type</span></a><span style="font-weight: 400;"> – classes de dados com métodos getters, construtores, equals, hashCode e toString implícitos:</span></p>
<p><span style="font-family: courier; font-weight: 400;">record Point(int x, int y) { }</span></p>
</td>
<td style="height: 128px; width: 81.1094px;">
<p><span style="font-weight: 400;">16</span></p>
</td>
<td style="height: 128px; width: 92.1562px;">
<p><span style="font-weight: 400;">14</span></p>
</td>
</tr>
<tr style="height: 207px;">
<td style="height: 207px; width: 491.734px;">
<p><span style="font-weight: 400;">Membros estáticos em classes internas (parte do JEP </span><a href="https://openjdk.java.net/jeps/395"><span style="font-weight: 400;">Record type</span></a><span style="font-weight: 400;">)</span></p>
<p><span style="font-family: courier; font-weight: 400;">new Object() {</span></p>
<p><span style="font-family: courier; font-weight: 400;">static record MyData(String data) {};</span></p>
<p><span style="font-family: courier; font-weight: 400;">public static final int CONSTANT = 1;</span></p>
<p><span style="font-family: courier; font-weight: 400;">};</span></p>
</td>
<td style="height: 207px; width: 81.1094px;">
<p><span style="font-weight: 400;">16</span></p>
</td>
<td style="height: 207px; width: 92.1562px;">
<p><span style="font-weight: 400;">16</span></p>
</td>
</tr>
<tr style="height: 110px;">
<td style="height: 110px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/394"><span style="font-weight: 400;">Pattern Matching for instanceof</span></a><span style="font-weight: 400;">:</span></p>
<p><span style="font-family: courier; font-weight: 400;">if (x instanceOf String s) { String a = s; }</span></p>
</td>
<td style="height: 110px; width: 81.1094px;">
<p><span style="font-weight: 400;">16</span></p>
</td>
<td style="height: 110px; width: 92.1562px;">
<p><span style="font-weight: 400;">14</span></p>
</td>
</tr>
<tr style="height: 207px;">
<td style="height: 207px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/378"><span style="font-weight: 400;">Text blocks</span></a><span style="font-weight: 400;">:</span></p>
<p><span style="font-family: courier; font-weight: 400;">String query = """</span></p>
<p><span style="font-family: courier; font-weight: 400;">SELECT "EMP_ID", "LAST_NAME"</span></p>
<p><span style="font-family: courier; font-weight: 400;">FROM "EMPLOYEE_TB";</span></p>
<p><span style="font-family: courier; font-weight: 400;">"""</span></p>
</td>
<td style="height: 207px; width: 81.1094px;">
<p><span style="font-weight: 400;">15</span></p>
</td>
<td style="height: 207px; width: 92.1562px;">
<p><span style="font-weight: 400;">13</span></p>
</td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><span style="font-weight: 400;">Novos métodos de String (</span><a href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html#formatted(java.lang.Object...)"><span style="font-weight: 400;">formatted</span></a><span style="font-weight: 400;">, stripIndent, translateEscapes)</span></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">15</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 207px;">
<td style="height: 207px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/361"><span style="font-weight: 400;">Switch expressions</span></a><span style="font-weight: 400;">:</span></p>
<p><span style="font-family: courier; font-weight: 400;">boolean isWeekend = switch (day) {</span></p>
<p><span style="font-family: courier; font-weight: 400;">case SATURDAY, SUNDAY -> true;</span></p>
<p><span style="font-family: courier; font-weight: 400;">default -> false;</span></p>
<p><span style="font-family: courier; font-weight: 400;">};</span></p>
</td>
<td style="height: 207px; width: 81.1094px;">
<p><span style="font-weight: 400;">14</span></p>
</td>
<td style="height: 207px; width: 92.1562px;">
<p><span style="font-weight: 400;">12</span></p>
</td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://www.baeldung.com/java12-string-api"><span style="font-weight: 400;">Novos métodos de String</span></a><span style="font-weight: 400;"> (indent, transform)</span></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">12</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/text/CompactNumberFormat.html"><span style="font-weight: 400;">CompactNumberFormat class</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">12</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://4comprehension.com/java-11-string-api-updates/"><span style="font-weight: 400;">Novos métodos de String</span></a><span style="font-weight: 400;"> (repeat, isBlank, strip, lines)</span></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">11</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 110px;">
<td style="height: 110px; width: 491.734px;">
<p><a href="http://openjdk.java.net/jeps/323"><span style="font-weight: 400;">var type allowed in Lambda Parameters</span></a><span style="font-weight: 400;">:</span></p>
<p><span style="font-family: courier; font-weight: 400;">(@NonNull var x) -> process(x)</span></p>
</td>
<td style="height: 110px; width: 81.1094px;">
<p><span style="font-weight: 400;">11</span></p>
</td>
<td style="height: 110px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html"><span style="font-weight: 400;">New HTTP client API</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">11</span></p>
</td>
<td style="height: 46px; width: 92.1562px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/332"><span style="font-weight: 400;">TLS v1.3</span></a><span style="font-weight: 400;"> – suporte para uma nova versão do protocolo SSL/TLS</span></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">11</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 110px;">
<td style="height: 110px; width: 491.734px;">
<p><a href="http://openjdk.java.net/jeps/286"><span style="font-weight: 400;">var type allowed for local variables</span></a><span style="font-weight: 400;">:</span></p>
<p><span style="font-family: courier; font-weight: 400;">var length = str.length();</span></p>
</td>
<td style="height: 110px; width: 81.1094px;">
<p><span style="font-weight: 400;">10</span></p>
</td>
<td style="height: 110px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://dev.to/ajiteshtiwari/java-9-flow-api-4e38"><span style="font-weight: 400;">Flow API (reactive streams)</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/261"><span style="font-weight: 400;">Java Platform Module System (modules)</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 110px;">
<td style="height: 110px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/269"><span style="font-weight: 400;">Collection factory methods</span></a><span style="font-weight: 400;">:</span></p>
<p><span style="font-family: courier; font-weight: 400;">List.of(a, b, c); Set.of(d, e, f, g); Map.of(k1, v1, k2, v2);</span></p>
</td>
<td style="height: 110px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 110px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 64px;">
<td style="height: 64px; width: 491.734px;">
<p><a href="https://www.javatpoint.com/java-9-stream-api-improvement"><span style="font-weight: 400;">Stream API improvements</span></a><span style="font-weight: 400;"> (takeWhile, dropWhile, ofNullable, iterate with condition)</span></p>
</td>
<td style="height: 64px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 64px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://docs.oracle.com/javase/9/docs/api/java/awt/image/MultiResolutionImage.html"><span style="font-weight: 400;">Multi-Resolution Image API</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/259"><span style="font-weight: 400;">Stack-Walking API</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 64px;">
<td style="height: 64px; width: 491.734px;">
<p><a href="https://openjdk.java.net/jeps/102"><span style="font-weight: 400;">Process API updates</span></a><span style="font-weight: 400;"> (informações detalhadas sobre processos, por ex. ID, onExit, destroy)</span></p>
</td>
<td style="height: 64px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 64px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://grokonez.com/java/java-9/java-9-completablefuture-api-improvements-delay-timeout-support"><span style="font-weight: 400;">new methods in CompletableFuture API</span></a><span style="font-weight: 400;"> (delay, timeout)</span></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://www.javatpoint.com/java-9-interface-private-methods"><span style="font-weight: 400;">Interface private methods</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="http://openjdk.java.net/jeps/277"><span style="font-weight: 400;">since and forRemoval in @Deprecated</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://www.javatpoint.com/java-default-methods"><span style="font-weight: 400;">Interface Default and Static Methods</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html"><span style="font-weight: 400;">Method References</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html"><span style="font-weight: 400;">Optional class</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html"><span style="font-weight: 400;">Lambda expressions</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html"><span style="font-weight: 400;">Functional interfaces</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html"><span style="font-weight: 400;">Stream API</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://jcp.org/en/jsr/detail?id=335"><span style="font-weight: 400;">Effectively Final Variables</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="http://openjdk.java.net/jeps/120"><span style="font-weight: 400;">Repeating Annotations</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
<tr style="height: 46px;">
<td style="height: 46px; width: 491.734px;">
<p><a href="https://jcp.org/en/jsr/detail?id=310"><span style="font-weight: 400;">New Date Time API</span></a></p>
</td>
<td style="height: 46px; width: 81.1094px;">
<p><span style="font-weight: 400;">8</span></p>
</td>
<td style="height: 46px; width: 92.1562px;"> </td>
</tr>
</tbody>
</table>
<p> </p>
<h2><span style="font-weight: 400;">New JDK tools and features since OpenJDK 8</span></h2>
<p> </p>
<table border="1" cellpadding="1" cellspacing="1" style="margin-left: auto; margin-right: auto; width: 100%;">
<tbody>
<tr>
<td style="width: 478.234px;">
<p><strong>Tool / feature</strong></p>
</td>
<td style="width: 53.5625px;">
<p><strong>Desde</strong></p>
</td>
<td style="width: 125.203px;">
<p><strong>Preview desde</strong></p>
</td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/343"><span style="font-weight: 400;">Packaging Tool</span></a></p>
</td>
<td style="width: 53.5625px;"> </td>
<td style="width: 125.203px;">
<p><span style="font-weight: 400;">14</span></p>
</td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/318"><span style="font-weight: 400;">Epsilon (no-op) GC</span></a></p>
</td>
<td style="width: 53.5625px;"> </td>
<td style="width: 125.203px;">
<p><span style="font-weight: 400;">11</span></p>
</td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="http://openjdk.java.net/jeps/317"><span style="font-weight: 400;">Experimental Java-Based JIT Compiler</span></a><span style="font-weight: 400;"> (Graal VM)</span></p>
</td>
<td style="width: 53.5625px;"> </td>
<td style="width: 125.203px;">
<p><span style="font-weight: 400;">10</span></p>
</td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/379"><span style="font-weight: 400;">Shenandoah GC</span></a></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">15</span></p>
</td>
<td style="width: 125.203px;">
<p><span style="font-weight: 400;">12</span></p>
</td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://docs.oracle.com/en/java/javase/15/gctuning/z-garbage-collector.html"><span style="font-weight: 400;">Z GC</span></a><span style="font-weight: 400;"> (</span><a href="https://openjdk.java.net/jeps/377"><span style="font-weight: 400;">JEP 377</span></a><span style="font-weight: 400;">)</span></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">15</span></p>
</td>
<td style="width: 125.203px;">
<p><span style="font-weight: 400;">11</span></p>
</td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/358"><span style="font-weight: 400;">Helpful NullPointerExceptions</span></a></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">14</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="http://openjdk.java.net/jeps/330"><span style="font-weight: 400;">Launching Java files as scripts</span></a></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">11</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/328"><span style="font-weight: 400;">Flight recorder</span></a><span style="font-weight: 400;"> (data collection framework for troubleshooting)</span></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">11</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8146115"><span style="font-weight: 400;">Docker Container Support:</span></a></p>
<p><span style="font-weight: 400;">-XX:-UseContainerSupport</span></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">10,</span></p>
<p><span style="font-weight: 400;">8u191</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8186248"><span style="font-weight: 400;">Flexible heap size selection</span></a><span style="font-weight: 400;">:</span></p>
<p><span style="font-weight: 400;">-XX:MaxRAMPercentage</span></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">10,</span></p>
<p><span style="font-weight: 400;">8u191</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="http://openjdk.java.net/jeps/310"><span style="font-weight: 400;">Application Class-Data Sharing</span></a><span style="font-weight: 400;"> (CDS)</span></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">10</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/282"><span style="font-weight: 400;">jlink</span></a><span style="font-weight: 400;"> – custom JRE image, subset of JRE</span></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/222"><span style="font-weight: 400;">JShell (Java REPL)</span></a><span style="font-weight: 400;"> – run Java commands interactively</span></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/238"><span style="font-weight: 400;">Multi-Release JAR Files</span></a></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
<tr>
<td style="width: 478.234px;">
<p><a href="https://openjdk.java.net/jeps/254"><span style="font-weight: 400;">Compact Strings</span></a></p>
</td>
<td style="width: 53.5625px;">
<p><span style="font-weight: 400;">9</span></p>
</td>
<td style="width: 125.203px;"> </td>
</tr>
</tbody>
</table>
<h2> </h2>
<h2><span style="font-weight: 400;">Deprecated/removed features and APIs:</span></h2>
<p> </p>
<table border="1" cellpadding="1" cellspacing="1" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td>
<p><strong>Feature / API</strong></p>
</td>
<td>
<p><strong>Depreciado desde</strong></p>
</td>
<td>
<p><strong>Removido desde</strong></p>
</td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/421"><span style="font-weight: 400;">Deprecate Finalization for Removal</span></a><span style="font-weight: 400;"> (finalize() and similar methods)</span></p>
</td>
<td>
<p><span style="font-weight: 400;">18</span></p>
</td>
<td> </td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/411"><span style="font-weight: 400;">Deprecate the Security Manager for Removal</span></a></p>
</td>
<td>
<p><span style="font-weight: 400;">17</span></p>
</td>
<td> </td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/390"><span style="font-weight: 400;">Constructors of primitive wrapper classes</span></a><span style="font-weight: 400;"> (e.g. new Integer(1))</span></p>
</td>
<td>
<p><span style="font-weight: 400;">16</span></p>
</td>
<td> </td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/366"><span style="font-weight: 400;">ParallelScavenge + SerialOld GC Combination</span></a></p>
</td>
<td>
<p><span style="font-weight: 400;">14</span></p>
</td>
<td> </td>
</tr>
<tr>
<td>
<p><a href="http://openjdk.java.net/jeps/289"><span style="font-weight: 400;">Applet API</span></a><span style="font-weight: 400;"> (</span><a href="https://openjdk.java.net/jeps/398"><span style="font-weight: 400;">Deprecated For Removal</span></a><span style="font-weight: 400;"> in Java 17)</span></p>
</td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
<td> </td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/407"><span style="font-weight: 400;">RMI Activation</span></a></p>
</td>
<td>
<p><span style="font-weight: 400;">15</span></p>
</td>
<td>
<p><span style="font-weight: 400;">17</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/403"><span style="font-weight: 400;">Strongly Encapsulate JDK Internals</span></a><span style="font-weight: 400;"> (except sun.misc.Unsafe and some more)</span></p>
<p><span style="font-weight: 400;">– internal JDK classes won’t be available anymore</span></p>
</td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
<td>
<p><span style="font-weight: 400;">17</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="http://openjdk.java.net/jeps/335"><span style="font-weight: 400;">Nashorn JavaScript Engine</span></a></p>
</td>
<td>
<p><span style="font-weight: 400;">11</span></p>
</td>
<td>
<p><span style="font-weight: 400;">15</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/381"><span style="font-weight: 400;">Solaris and SPARC Ports</span></a></p>
</td>
<td>
<p><span style="font-weight: 400;">14</span></p>
</td>
<td>
<p><span style="font-weight: 400;">15</span></p>
</td>
</tr>
<tr>
<td>
<p><span style="font-weight: 400;">CMS GC</span></p>
</td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
<td>
<p><span style="font-weight: 400;">14</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/367"><span style="font-weight: 400;">Pack200 Tools and API</span></a></p>
</td>
<td>
<p><span style="font-weight: 400;">11</span></p>
</td>
<td>
<p><span style="font-weight: 400;">14</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="https://www.infoworld.com/article/3305073/removed-from-jdk-11-javafx-11-arrives-as-a-standalone-module.html"><span style="font-weight: 400;">Java FX</span></a><span style="font-weight: 400;"> (moved to </span><a href="https://openjfx.io/"><span style="font-weight: 400;">OpenJFX</span></a><span style="font-weight: 400;">)</span></p>
</td>
<td> </td>
<td>
<p><span style="font-weight: 400;">11</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="https://www.oracle.com/java/technologies/javase/11-relnote-issues.html"><span style="font-weight: 400;">Java Web Start</span></a><span style="font-weight: 400;"> (was only in Oracle JDK)</span></p>
</td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
<td>
<p><span style="font-weight: 400;">11</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="http://openjdk.java.net/jeps/320"><span style="font-weight: 400;">Java EE and CORBA modules</span></a><span style="font-weight: 400;"> (JAX-WS, JAXB, JAF, Common Annotations, CORBA, JTA)</span></p>
<p><span style="font-weight: 400;">Look here to find </span><a href="https://stackoverflow.com/questions/48204141/replacements-for-deprecated-jpms-modules-with-java-ee-apis"><span style="font-weight: 400;">replacements for the removed modules</span></a></p>
</td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
<td>
<p><span style="font-weight: 400;">11</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="http://openjdk.java.net/jeps/313"><span style="font-weight: 400;">javah</span></a> <a href="http://openjdk.java.net/jeps/313"><span style="font-weight: 400;">Native-Header Generator</span></a></p>
</td>
<td> </td>
<td>
<p><span style="font-weight: 400;">10</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="http://openjdk.java.net/jeps/241"><span style="font-weight: 400;">jhat Heap Visualizer</span></a></p>
</td>
<td> </td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="http://openjdk.java.net/jeps/231"><span style="font-weight: 400;">Launch-Time JRE Version Selection</span></a></p>
</td>
<td> </td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/220#Removed:-rt-jar-and-tools-jar"><span style="font-weight: 400;">rt.jar and tools.jar</span></a></p>
</td>
<td> </td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="https://openjdk.java.net/jeps/220#Removed:-The-extension-mechanism"><span style="font-weight: 400;">The extension mechanism (java.ext.dirs property)</span></a></p>
</td>
<td> </td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
</tr>
<tr>
<td>
<p><a href="http://openjdk.java.net/jeps/214"><span style="font-weight: 400;">Rarely-Used GC Combinations</span></a></p>
</td>
<td>
<p><span style="font-weight: 400;">8</span></p>
</td>
<td>
<p><span style="font-weight: 400;">9</span></p>
</td>
</tr>
</tbody>
</table>
<p> <span>Para mais detalhes, o catálogo </span><a href="https://javaalmanac.io/"><span>javaalmanac.io/</span></a><span> é muito útil para navegar pelas mudanças em Java ao longo de todo o seu histórico. Ele pode fornecer diferenças completas de APIs entre versões Java selecionadas, por exemplo, entre Java 8 e Java 11. Muito útil se você está pensando em migrar para uma versão específica do Java.</span></p>
<h3><span style="font-weight: 400;">Fontes (Em Inglês):</span></h3>
<p><a href="https://advancedweb.hu/a-categorized-list-of-all-java-and-jvm-features-since-jdk-8-to-18/"><span style="font-weight: 400;">A categorized list of all Java and JVM features since JDK 8 to 18 - Advanced Web Machinery</span></a></p>
<p><a href="https://inside.java/2022/08/29/java-8-to-18/"><span style="font-weight: 400;">Java 8 to 18: most important changes in the java platform</span></a></p>
<p><a href="https://ondro.inginea.eu/index.php/new-features-in-java-versions-since-java-8/"><span style="font-weight: 400;">New features between Java 8 and Java 18 - .Lost in Coding</span></a></p>
<p><br /></p><div><div><p dir="ltr" style="line-height: 1.656; margin-bottom: 3pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh5.googleusercontent.com/lmoqvd5N1g7Y5CMit4420jWQwgwr-jvTtfcBLR8p5lFVRkJvfBYmhIkEjIyn3RkVIKsvEFnubDsK-XEGdWsSCgPkJ-PW3kL45qwKF5r2imYQQJWKyXWfQZQu9INuZ4P1RmNEkzlNsA_apRuKilI6MugOt6tFL1TBIa1unXQtQgi9GRNKfcJlTd0i8A" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><p><br /><br /></p></div></div><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com1tag:blogger.com,1999:blog-6448280182389226496.post-48535059254203857942022-07-05T22:08:00.005-03:002022-07-05T22:11:19.647-03:00Projeto Leyden atrasa o compilador OpenJDK AOT e otimiza o compilador JIT em vez disso<meta content="summary" name="twitter:card"></meta>
<meta content="Projeto Leyden atrasa" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaMmKqkgLyDcBGNlr58OQaUsYj4z6kQpPsJdRqc9ksB-CADLi52tzhn5fsVkGnFJBg4Aj5Xmrcl10PIdOpCFyDW0CqMbWgraVvcBeYd7suTflRHRTZjVSqV_3hR6uDOx7YAIfNHfcxPm0MBgP-AeNOlJtme5bm2CC3Tfy06rybMlzgZnmYh7TmfAHkDQ/s16000/62c167e3bc842d00efff119a0ae38939.webp" name="twitter:image"></meta>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"></span></p><div class="separator" style="clear: both; text-align: center;"><span id="docs-internal-guid-a10f6685-7fff-15d4-656a-478095d7a842"><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: left;"><span style="font-family: Arial; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaMmKqkgLyDcBGNlr58OQaUsYj4z6kQpPsJdRqc9ksB-CADLi52tzhn5fsVkGnFJBg4Aj5Xmrcl10PIdOpCFyDW0CqMbWgraVvcBeYd7suTflRHRTZjVSqV_3hR6uDOx7YAIfNHfcxPm0MBgP-AeNOlJtme5bm2CC3Tfy06rybMlzgZnmYh7TmfAHkDQ/s640/62c167e3bc842d00efff119a0ae38939.webp" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="360" data-original-width="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaMmKqkgLyDcBGNlr58OQaUsYj4z6kQpPsJdRqc9ksB-CADLi52tzhn5fsVkGnFJBg4Aj5Xmrcl10PIdOpCFyDW0CqMbWgraVvcBeYd7suTflRHRTZjVSqV_3hR6uDOx7YAIfNHfcxPm0MBgP-AeNOlJtme5bm2CC3Tfy06rybMlzgZnmYh7TmfAHkDQ/s16000/62c167e3bc842d00efff119a0ae38939.webp" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div>Projeto Leyden atrasa o compilador OpenJDK AOT e otimiza o compilador JIT em vez disso</span></h1><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O objetivo do </span><a href="https://openjdk.java.net/projects/leyden/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Projeto Leyden</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> é "resolver os pontos problemáticos de longo prazo do tempo de inicialização lenta do Java, do tempo lento para o desempenho máximo". Ele queria chegar lá "introduzindo um conceito de imagens estáticas" no OpenJDK. Imagens estáticas resultam da </span><a href="https://www-infoq-com.translate.goog/articles/native-compilations-boosts-java/?_x_tr_sl=en&_x_tr_tl=pt&_x_tr_hl=pt-BR&_x_tr_pto=wapp" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">compilação Ahead-of-Time (AOT) para executáveis nativos</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> . Após dois anos sem atividade publicamente visível, o Projeto Leyden mudou em maio de 2022 para primeiro otimizar a compilação Just-in-Time (JIT). As " </span><a href="https://mail.openjdk.java.net/pipermail/leyden-dev/2022-May/000001.html" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">otimizações resultantes quase certamente serão mais fracas</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> " do que o planejado inicialmente e alcançarão os principais desenvolvedores Java no final de 2025, no mínimo. O projeto Graal da Oracle já atingiu o objetivo do Projeto Leyden, mas a um custo que o projeto quer evitar por enquanto.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O projeto Graal tem origem no Oracle Labs e não faz parte do OpenJDK. Sua </span><a href="https://www-infoq-com.translate.goog/articles/native-java-graalvm?_x_tr_sl=en&_x_tr_tl=pt&_x_tr_hl=pt-BR&_x_tr_pto=wapp" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">imagem nativa GraalVM</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> é um compilador Java AOT que produz executáveis nativos hoje. Eles têm </span><a href="https://www.youtube.com/watch?v=EpcovUvQ-XA&t=179s" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">quatro vantagens</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> sobre o compilador JIT do Java: inicialização rápida, menor uso de memória e CPU, menos vulnerabilidades de segurança e tamanhos de arquivo menores.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Mas essas conquistas têm um custo: o GraalVM Native Image impõe uma suposição chamada de mundo fechado em aplicativos Java que elimina toda uma categoria de aplicativos Java. Por quê? Porque Java é uma linguagem dinâmica e dá aos aplicativos muito poder em tempo de execução, como reflexões, carregamento de classes ou até mesmo construção de classes. E alguns desses recursos </span><a href="https://www-infoq-com.translate.goog/articles/native-java-aligning/?_x_tr_sl=en&_x_tr_tl=pt&_x_tr_hl=pt-BR&_x_tr_pto=wapp" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">não funcionam no mundo fechado</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> do GraalVM Native Image. É por isso que o Projeto Leyden agora quer "explorar um espectro de restrições, mais fracas do que a restrição do mundo fechado, e descobrir quais otimizações elas permitem". Ainda assim, Leyden "provavelmente [...] produzirá imagens totalmente estáticas", embora apenas "a longo prazo".</span></p><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 16pt; text-align: left;"><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">O OpenJDK já tentou a compilação AOT</span></h3><div><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O Project Leyden é a segunda tentativa do OpenJDK de compilação AOT. O primeiro esforço foi com a jaotc na JEP 295, Ahead-of-Time Compilation, entregue no JDK 9 em setembro de 2017. Assim como o GraalVM Native Image, utilizou o projeto Graal. Ao contrário do GraalVM Native Image, era altamente impopular: quando a Oracle </span><a href="https://bugs.openjdk.java.net/browse/JDK-8255616" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">removeu o jaotc de suas compilações Java 16</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> , "ninguém reclamou", a Oracle observou secamente com JEP 410, Remove the Experimental AOT e JIT Compiler, entregue no JDK 17.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O Projeto Leyden teve uma história incomum para um projeto OpenJDK. O arquiteto da linguagem Java Mark Reinhold o propôs em abril de 2020, seguido pelo OpenJDK que o aprovou como projeto em junho de 2020. Mas o projeto não mostrou nenhum progresso visível nos dois anos entre essa aprovação e a criação de sua lista de discussão em maio de 2022. Isso é porque o projeto está apenas começando, focando </span><a href="https://mail.openjdk.org/pipermail/leyden-dev/2022-May/000000.html" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">" mais em conceitos do que em código " agora</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. Reinhold afirmou que componentes como o HotSpot JVM, o compilador C2, o compartilhamento de dados de classe de aplicativo (CDS) e a ferramenta jlink de vinculação" são alvos de otimização. Notavelmente ausente dessa lista foi o </span><a href="https://youtu.be/0evEs_3yaEI" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">CRaC</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, um projeto OpenJDK que reduz o tempo de inicialização carregando o estado do aplicativo Java do disco.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Um cálculo no verso do envelope mostra as datas de entrega possíveis. As versões LTS agora têm uma importância desproporcional no Java. Ben Evans, da empresa de monitoramento New Relic, anunciou na Devoxx UK 2022 que " </span><a href="https://youtu.be/SYO-LmA647E?t=186" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">nenhuma versão não LTS já ultrapassou 1% de participação de mercado</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> ". Isso mostra que os desenvolvedores Java convencionais migram apenas de uma versão Java LTS para outra versão LTS.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como o Projeto Leyden está em andamento, poucos resultados estarão prontos para produção em setembro de 2023 para o JDK 21, o </span><a href="https://www.infoq.com/news/2021/10/oracle-java-two-year-lts" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">próximo lançamento do LTS</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> . Portanto, os desenvolvedores Java convencionais provavelmente verão apenas os primeiros resultados do Project Leyden com o lançamento do LTS depois disso, JDK 25, em setembro de 2025. Com base nessa suposição, o Project Leyden entregaria, no mínimo, a compilação AOT para executáveis nativos com o JDK 29 em setembro de 2027.</span></p><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 16pt; text-align: left;"><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Spring Boot reage ao projeto Leyden</span></h3><div><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Pelo menos alguns dos recursos considerados para o Projeto Leyden, como jlink ou CRaC, exigem suporte à estrutura do aplicativo para funcionar melhor. É por isso que a InfoQ entrou em contato com os desenvolvedores que representam Spring Boot, Quarkus e Micronaut para sua reação inicial ao anúncio do Project Leyden.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O líder do projeto Spring Framework, Juergen Hoeller, aprova o Projeto Leyden:</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O Projeto Leyden é uma iniciativa promissora alinhada com a direção geral que estamos tomando no Spring Framework 6 e Spring Boot 3.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Hoeller também adota o CRaC para o Spring:</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os snapshots de heap CRaC podem se tornar uma opção comum para melhorar o tempo de inicialização de aplicativos baseados em Spring. Tirando o snapshot bem no final da fase de inicialização do aplicativo, dificilmente haveria qualquer arquivo aberto ou recursos de rede nesse ponto, de acordo com as expectativas do CRaC. O Spring ainda redefine seus caches comuns no final de uma atualização de contexto de aplicativo, limpando metadados relacionados à inicialização antes de repovoar dinamicamente os caches com metadados relacionados a solicitações. Em termos de contexto de aplicação reagindo especificamente a um evento de snapshot ou melhorando a "snapsafety" de componentes comuns, certamente tentaremos capacitar os primeiros adotantes na medida do tecnicamente viável em nossa linha Spring Framework 6.x.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Hoeller acha que o Spring dará suporte jlink ao Java Platform Module System (JPMS) em breve:</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os marcos atuais do Spring Framework 6.0 ainda não incluem descritores de informações de módulo. Isso está no roteiro para o milestone M6 em setembro, reavaliando a prontidão do sistema de módulos do ecossistema de terceiros à medida que avançamos para nossa fase de candidatos à versão 6.0. Com o Project Leyden potencialmente transformando jlink em uma ferramenta mais poderosa e versátil, pretendemos nos preparar não apenas para jlink's as capacidades atuais, mas também para sua evolução futura.</span></p><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 16pt; text-align: left;"><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Quarkus reage ao projeto Leyden</span></h3><div><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O cofundador e co-líder da Quarkus, Jason Greene, comentou sobre o Projeto Leyden:</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Estamos muito empolgados com o objetivo do projeto Leyden de revisar a especificação da linguagem Java para oferecer melhor suporte a imagens estáticas, compilação nativa e outras tecnologias, como checkpointing JVM. Além disso, ficamos felizes em ver o mundo fechado remanescente como uma provável meta de longo prazo para o projeto.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Greene adota o CRaC para Quarkus:</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O suporte inicial para o projeto de pesquisa CRaC foi recentemente contribuído para o projeto Quarkus pelo líder CRaC. Como o Quarkus realiza a otimização do tempo de compilação, independentemente do tipo de destino do tempo de execução, você ainda vê economias consideráveis ao executar no OpenJDK, não apenas no GraalVM. Adicionar uma abordagem de ponto de verificação, como CRaC, em cima do OpenJDK otimiza ainda mais o tempo de inicialização. Não traz economia de memória semelhante às imagens nativas, mas é uma opção futura interessante para aplicativos que preferem ou exigem execução de JVM.</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">No entanto, Greene está mais relutante em relação jlink ao JPMS em Quarkus:</span></p><div style="text-align: left;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A partir de hoje, jlink só traz benefícios para a sobrecarga de armazenamento de um aplicativo baseado em JVM (a sobrecarga de memória e o tempo de inicialização são essencialmente os mesmos sem ela). No entanto, a prática comum em um contêiner ou aplicativo Kubernetes é sobrepor uma imagem de base JVM padrão, o que já traz mais economia do que alternar todos os aplicativos para jlink (já que cada um agruparia sua própria JVM aparada). No caso de uma imagem nativa, os elementos refinados da JVM são compilados na imagem, então jlink não é útil neste cenário também. Da mesma forma, com o JPMS, o Quarkus já tem a noção de modularidade por meio de extensões do Quarkus, permitindo que você reduza seu conjunto de dependências apenas para o que você precisa. A abordagem adotada pelo Quarkus é compatível com o classpath simples e plano que a maioria do ecossistema Java e as ferramentas de compilação preferem hoje. Do lado do custo, mudar para um modelo de módulo JPMS puro conforme jlink necessário (sem módulos automáticos) significaria uma mudança radical não apenas no Quarkus, mas em muitas das bibliotecas nas quais o Quarkus se baseia. Antes de considerar uma mudança, gostaríamos de ver esses fatores se equilibrarem melhor.</span></p><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 16pt; text-align: left;"><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Micronaut reage ao Projeto Leyden</span></h3><div><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Sergio del Amo Caballero, engenheiro de software principal da Object Computing, Inc. (OCI), não tinha uma declaração oficial do Micronaut Framework sobre o Projeto Leyden. Mas ele apontou para um </span><a href="https://github.com/micronaut-projects/micronaut-core/issues/7601" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">problema recente do GitHub</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> para adicionar suporte CRaC no Micronaut.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Caballero também compartilhou um </span><a href="https://youtube.com/clip/UgkxyPlY-jWrPCWnBdf-EeKd6iMklqp8a7df" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">clipe</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> do YouTube de julho de 2020 com o criador do Micronaut, Graeme Rocher, comentando sobre o JPMS: o Micronaut suporta JPMS e publica arquivos de informações do módulo, mas precisa "equilibrar isso com o suporte ao Java 8". O JPMS foi adicionado no Java 9, mas o Micronaut 3.5, a versão atual, ainda roda no Java 8.</span></p><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 16pt; text-align: left;"><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Conclusão</span></h3><div><span style="color: #434343; font-family: Arial; font-size: 14pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Até agora, o OpenJDK não abordou "os pontos problemáticos de longo prazo do tempo de inicialização lento do Java, do tempo lento para o desempenho máximo". Primeiro, seu jaotc compilador AOT não conseguiu ganhar força e foi aposentado. Então o Projeto Leyden começou a padronizar a compilação nativa em Java, mas ficou parado por dois anos.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Agora que o Project Leyen mudou para otimizar a compilação JIT, as coisas estão melhorando: tanto o Spring quanto o Quarkus adotam o CRaC para reduzir o tempo de inicialização. Mas quando se trata de tamanhos de aplicativos Java menores, apenas a Micronaut adere à sugestão do Projeto Leyden de usar o JPMS. O Spring planeja oferecer suporte ao JPMS na versão 6 até o final de 2022, embora o ecossistema Spring não possa. E a Quarkus atualmente não tem planos de adicionar o JPMS.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os resultados, na forma de JEPs, do Projeto Leyden podem alcançar os principais desenvolvedores Java até o final de 2025, no mínimo. Portanto, pelo menos até então, a combinação do compilador GraalVM Native Image AOT com uma estrutura como Quarkus, Micronaut ou o próximo Spring Boot 3 continua sendo a melhor opção para evitar "tempo de inicialização lento do Java, tempo lento para desempenho máximo e grande área de cobertura ."</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="color: black; font-family: Arial; font-size: medium; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">Fonte:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: left;"><span><span style="font-size: medium;"><br /></span></span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="-webkit-text-decoration-skip: none; color: #1155cc; font-family: Arial; font-size: medium; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre;"><a href="https://www.infoq.com/news/2022/06/project-leyden-delays-aot/" target="_blank">https://www.infoworld.com/article/3652336/java-19-may-be-quite-ambitious.amp.html</a></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: left;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: left;"><a href="https://twitter.com/sandrogiacom" style="text-align: justify; text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/VxP2607dFc-7Emb_ghVxeoLcCSaselkkn3gy0_wjbUlJnRWSrX3e-W7kxg_f4xSjiurgOz-yOCKxXcgNoTj7tUllGg3bwS6wx1Uhpb-07YpVdx-FuOFwcdEueZHdM8yOJHaZqbod" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><div style="text-align: left;"><br /></div></span></div><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-35687481574274479402022-06-02T21:00:00.019-03:002022-06-03T07:37:32.748-03:00Java 19 pode ser grande<meta content="summary" name="twitter:card"></meta>
<meta content="Java 19 pode ser grande" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://blogger.googleusercontent.com/img/a/AVvXsEgcuiI8akBB-Xn61UXCtBPWF4gmY6gA3plzHePRVXiI2A1ivxINRyNnKA_P-N6Plltf-xRsuhZlUAeWRHlmFc5zXedFcuozCuZsEzUpDcB48xrePTf0_QhSrntjSzRkzHmcLEPfHJtZIdTid85rHZCBzBoWiweZlYcmFyvjkc_90Im-y6F9u0tnozsDNg=w640-h428" name="twitter:image"></meta>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgcuiI8akBB-Xn61UXCtBPWF4gmY6gA3plzHePRVXiI2A1ivxINRyNnKA_P-N6Plltf-xRsuhZlUAeWRHlmFc5zXedFcuozCuZsEzUpDcB48xrePTf0_QhSrntjSzRkzHmcLEPfHJtZIdTid85rHZCBzBoWiweZlYcmFyvjkc_90Im-y6F9u0tnozsDNg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="4912" data-original-width="7360" height="428" src="https://blogger.googleusercontent.com/img/a/AVvXsEgcuiI8akBB-Xn61UXCtBPWF4gmY6gA3plzHePRVXiI2A1ivxINRyNnKA_P-N6Plltf-xRsuhZlUAeWRHlmFc5zXedFcuozCuZsEzUpDcB48xrePTf0_QhSrntjSzRkzHmcLEPfHJtZIdTid85rHZCBzBoWiweZlYcmFyvjkc_90Im-y6F9u0tnozsDNg=w640-h428" width="640" /></a></span></div><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java 19 pode ser grande</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: medium;"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">A próxima versão do Java padrão parece pronta para incluir uma API de memória e função estrangeira</span><span style="color: black; font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;"> (</span><span style="color: #222222; font-family: Arial; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">Foreign function and memory API</span><span style="color: black; font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">), uma API de vetor (</span><span style="color: black; font-family: Arial; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">A vector API</span><span style="color: black; font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">, correspondência de padrões para expressões de switch (</span><span style="color: black; font-family: Arial; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">Pattern matching for switch expressions</span><span style="color: black; font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">), genéricos universais (</span><span style="color: black; font-family: Arial; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">Universal generics</span><span style="color: black; font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;">) e muito mais.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b id="docs-internal-guid-1c004fbf-7fff-a9ac-5f53-5a10548c2b53" style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: medium;"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Com o lançamento do</span><a href="https://openjdk.java.net/projects/jdk/18/" style="text-decoration: none;" target="_blank"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;"> Java 18</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, o</span><a href="https://openjdk.java.net/projects/jdk/19/" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">Java 19</span></a><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;"> </span><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">está começando a tomar forma. A próxima versão do Java padrão está definida para avançar </span></span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">com uma API para interoperar com o código fora do tempo de execução do Java, a primeira de </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">muitas propostas potenciais que podem abranger recursos que variam de genéricos universais a </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">uma porta RISC-V.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">A proposta para o Java 19 agora flutuando na comunidade OpenJDK é uma função estrangeira e</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: medium;"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> API de memória (</span><span style="background-color: transparent; color: #222222; font-family: Arial; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Foreign function and memory API</span><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">), que permitiria que programas Java façam interoperação com código e dados fora do tempo </span></span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">de execução Java. O recurso será visualizado no Java Development Kit (JDK) 19, que deve chegar</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> em setembro.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: medium;"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Identificada como J</span><a href="https://openjdk.java.net/jeps/424" style="text-decoration: none;" target="_blank"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">EP (JDK Enhancement Proposal) 424</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, a função externa e a API de memória invocariam o código fora da JVM acessando a memória externa. </span></span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Essa API foi apresentada em um estágio de incubadora no JDK 17 e será reincubada no JDK 18, </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">que está programado para ser lançado em 22 de março. Para o JDK 19, a API passaria para um</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> estágio de visualização, incorporando refinamentos com base no feedback. O JDK 19 será uma </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">versão de curto prazo do Java com suporte por apenas seis meses.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: medium;"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Outra possibilidade de inclusão no JDK 19 é um</span><a href="https://openjdk.java.net/jeps/426" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">vetor API</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, que está sendo incubado pela terceira vez no JDK 18. Uma quarta incubação foi proposta. </span></span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Essa API expressaria cálculos vetoriais que compilam em tempo de execução para instruções</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: medium;"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> vetoriais ideais.</span><a href="https://openjdk.java.net/jeps/427" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">A correspondência de padrões para expressões e instruções switch</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, que está passando por uma terceira visualização no JDK 19, é outra possibilidade.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">No geral, o Java este ano está programado para continuar a evolução de quatro iniciativas,</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: medium;"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> disse a Oracle. Isso inclui o</span><a href="https://openjdk.java.net/projects/valhalla" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">Projeto Valhalla</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, para incubar recursos avançados de linguagem e JVM;</span><a href="https://openjdk.java.net/projects/panama" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">Projeto Panamá</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, para interligar código nativo e JVM;</span><a href="https://openjdk.java.net/projects/loom" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">Projeto Loom</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, para melhorar a concorrência; e o</span><a href="https://openjdk.java.net/projects/amber" style="text-decoration: none;" target="_blank"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">Projeto Amber</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, para explorar e incubar recursos de linguagem Java menores e orientados à produtividade.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Os seguintes recursos, que são objeto de JEPs ou rascunhos de JEPs não direcionados a uma </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">versão específica do Java, podem muito bem chegar ao Java 19:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Uma prévia dos genéricos universais, da Valhalla. Entregues por meio de três JEPs, os </span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">genéricos universais unificariam o tratamento de tipos de referência e primitivos no código </span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">genérico, permitindo que as variáveis de tipo Java abrangessem os dois tipos de tipos.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Uma visualização de objetos de valor, também um aprimoramento do Valhalla, fornecendo </span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">instâncias de classe que possuem apenas campos de instância final e não possuem identidade </span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">de objeto. Classes de valor sem identidade seriam declaradas.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Uma visualização de padrões de registro, para desconstruir valores de registro. Isso faz parte </span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">do Projeto Amber.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Fixação de região para o coletor de lixo G1, para reduzir a latência implementando a fixação</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> de região para G1 para que a coleta de lixo não precise ser desabilitada durante regiões </span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">críticas JNI (Java Native Interface).</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Uma porta Linux do JDK para RISC-V, uma arquitetura de conjunto de instruções de código </span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">aberto e isenta de royalties.</span></p></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Alguns desses recursos, se não terminarem no JDK 19, podem acabar em uma versão subsequente, </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">como o JDK 20, que chegaria em março de 2023, com base na cadência de lançamento de</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> seis meses do Java padrão. Outros podem escorregar para uma versão ainda posterior ou </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">talvez nunca fazer o corte para estar em Java.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Fonte:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><b style="font-weight: normal;"><span style="font-size: medium;"><br /></span></b></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-size: medium; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;"><a href="https://www.infoworld.com/article/3652336/java-19-may-be-quite-ambitious.amp.html" target="_blank">https://www.infoworld.com/article/3652336/java-19-may-be-quite-ambitious.amp.html</a></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><div><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><a href="https://twitter.com/sandrogiacom" style="text-align: justify; text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/VxP2607dFc-7Emb_ghVxeoLcCSaselkkn3gy0_wjbUlJnRWSrX3e-W7kxg_f4xSjiurgOz-yOCKxXcgNoTj7tUllGg3bwS6wx1Uhpb-07YpVdx-FuOFwcdEueZHdM8yOJHaZqbod" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><p><br /></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-75111107008504094022022-05-30T12:07:00.002-03:002022-05-30T12:15:48.215-03:00Relatório do Estado do Ecossistema Java da New Relic - 2022<meta content="summary" name="twitter:card"></meta>
<meta content="Java 11 é o novo padrão!" name="twitter:title"></meta>
<meta content="Relatório do Estado do Ecossistema Java da New Relic - 2022" name="twitter:description"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://lh4.googleusercontent.com/Ypl-YVaT8uhO1FzgRYeeBgJX_sxlZjWxMjHGFPQi_7RjYMojcIUa15yiEsMcpJT_GLi50IdOFGaiXRWnVA7ZD5wFHMH7JCnYNdKXtxoCY-xXFX7p1wc8Tmm7iYmCZO8iNjjWslFeP0OKVTy0pw" name="twitter:image"></meta>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Relatório do Estado do Ecossistema Java da New Relic</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span id="docs-internal-guid-25ff86e0-7fff-447d-508d-6abd84b95f19"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Uma visão aprofundada de uma das linguagens de programação mais populares</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A </span><a href="https://newrelic.com/" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">New Relic</span></a><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> publicou recentemente um novo relatório sobre o Estado do Ecossistema Java usando dados coletados em janeiro de 2022 de milhões de aplicativos anônimos que forneceram dados de desempenho.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Java 11 é o novo padrão</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; white-space: pre-wrap;">De acordo com o relatório, o Java 11 é o novo padrão para ambiente de produção, pois a adoção subiu de 11% em 2020 para 48% em 2022, avançando para o Java 8, um segundo próximo a 46%. Outras versões LTS do Java são muito distantes e seu uso é apenas uma pequena fração.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A imagem abaixo mostra o uso de versões Java:
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><img height="402" src="https://lh4.googleusercontent.com/Ypl-YVaT8uhO1FzgRYeeBgJX_sxlZjWxMjHGFPQi_7RjYMojcIUa15yiEsMcpJT_GLi50IdOFGaiXRWnVA7ZD5wFHMH7JCnYNdKXtxoCY-xXFX7p1wc8Tmm7iYmCZO8iNjjWslFeP0OKVTy0pw" style="color: #252525; font-family: Roboto, sans-serif; font-size: 13.5pt; margin-left: 0px; margin-top: 0px; white-space: pre-wrap;" width="652" /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; white-space: pre-wrap;">O Java 17 não subiu nas paradas, mas nos poucos meses desde seu lançamento, já ultrapassou os lançamentos Java 6, Java 10 e Java 16.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O suporte para Java 7 está terminando em 2022 e, no entanto, 1,71% dos aplicativos ainda o utilizam em produção. Enquanto isso, o Java 6 não é mais suportado, mas 0,27% dos aplicativos o estão usando. A maioria dos aplicativos que estão usando Java 6 e Java 7 são aplicativos legados que não foram atualizados.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 396px; overflow: hidden; width: 649px;"><img height="396" src="https://lh6.googleusercontent.com/XCjPmT9LB4tks1TkTRKYQhajSwE1t6JtyPREWq8u_QD1gSwtF3YhuTqaQeiql3yjOODgjOKzA81SShqLz5VL7sigD9CoT3d0kAPnPKw-zF0SHtH90WWSNWlhx_3_T9jK7wV9fCfjGTH4rGFB8w" style="margin-left: 0px; margin-top: 0px;" width="649" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 20pt; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 20pt; white-space: pre-wrap;">Java 14 é a versão não LTS mais popular
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A partir do Java 9, o padrão de lançamento da plataforma mudou. A cada seis meses uma nova versão do Java era disponibilizada, mas essas versões só eram suportadas até o próximo lançamento. A intenção era disponibilizar novos recursos com mais frequência.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 377px; overflow: hidden; width: 701px;"><img height="377" src="https://lh6.googleusercontent.com/8n8IkFUJ7wuvDdEghXxhTs7CLoP9W-4Q-pFDyLXjnm7juFYDWFd58adtliHjVkmqtohdJ-hh51SBZ4X9U_c0H2-mMW7kvWh7G4lS8O6a6YOx5Mz0ULbjE00sV3Y3fmQoxMWB84kbYM1pF9XAjg" style="margin-left: 0px; margin-top: 0px;" width="701" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 20pt; white-space: pre-wrap;">
A popularidade da Oracle está diminuindo, a Amazon está em ascensão
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Nos últimos anos, houve mudanças na origem das distribuições do Java Developer Kit (JDK) em uso. Onde muitos desenvolvedores costumavam obter seu JDK da Oracle, o código aberto do Java no projeto OpenJDK rendeu muitas opções.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A tabela a seguir mostra o afastamento dos binários da Oracle após o licenciamento mais restritivo de sua distribuição JDK 11 (antes de retornar a uma postura mais aberta com o Java 17). Em 2020, a Oracle foi o fornecedor mais popular, compreendendo cerca de 75% do mercado Java. Enquanto eles mantêm o primeiro lugar, sua participação é metade do que era. A Amazon subiu drasticamente para 22% do mercado (acima dos 2,18% em 2020).</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 332px; overflow: hidden; width: 718px;"><img height="332" src="https://lh6.googleusercontent.com/oGKdSlf-h6_TOut6GZGUdYUMF73TbpQ7V2_WwQZZkDd2egfVvnnahTI058oDvWsSLCzlAPilRwtne9tmOrRj5Fti9NPc-7ujd6gDTtFn104q6vGu-C634fyzdDQtTdpFTKfKGLlbqHnFEvHJCQ" style="margin-left: 0px; margin-top: 0px;" width="718" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 20pt; white-space: pre-wrap;">Os contêineres estão rodando ao nosso redor
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; white-space: pre-wrap;">Os aplicativos de conteinerização tornaram-se extremamente populares, e os dados de aplicativos Java da New Relic confirmam essa tendência. Mais de 70% dos aplicativos Java que se reportam à New Relic o fazem a partir de um contêiner.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Configurações de computação em contêineres
</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os contêineres afetam como as pessoas alocam recursos de computação e memória. Por exemplo, os dados da New Relic mostram uma porcentagem muito maior de aplicativos executados com menos de quatro núcleos quando em containers.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-5f9dd045-7fff-1efe-e0a6-08a63bc09054"><span style="font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 279px; overflow: hidden; width: 718px;"><img height="279" src="https://lh6.googleusercontent.com/Rm_9peN90dxlxYIIYLW556EqKlS-NxdvNxKcPTel5E2PMAv8KaLbj-8YVktz7nFHFkn4osiZQ527hH3xsNu5-i8sGeVOjlDosCBx2x7kk6qnf_yrazUb-Vu-7TSa3mXJYpr1r47VtKqwX6quww" style="margin-left: 0px; margin-top: 0px;" width="718" /></span></span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O desejo de executar menor faz muito sentido em ambientes de nuvem onde as pessoas geralmente implantam contêineres. Mas essa tendência pode apresentar problemas inesperados para alguns aplicativos. Em particular, muitos dos benefícios simultâneos do coletor de lixo G1 padrão em máquinas virtuais Java (JVMs) recentes desaparecem quando executados com menos de dois núcleos. Todas essas instâncias de núcleo único também podem estar usando o coletor serial - e pagando o custo de desempenho disso - mas muitos provavelmente nem sabem disso.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Configurações de memória em contêineres</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Tendências semelhantes surgem ao comparar configurações de memória, com tendência a instâncias menores em contêineres. Os dados da New Relic mostram que apenas cerca de 80% dos aplicativos em contêiner solicitam explicitamente um limite superior na memória JVM por meio dos sinalizadores -Xmx ou -XX:MaxRAMPercentage. Os recursos de reconhecimento de contêiner na JVM, desde a versão 9, significam que isso provavelmente não é um problema de segurança para esses aplicativos como costumava ser, desde que a JVM seja o único processo em execução em cada contêiner.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-f8cea698-7fff-6034-bc1f-d63bf180cf40"><span style="font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 253px; overflow: hidden; width: 718px;"><img height="253" src="https://lh6.googleusercontent.com/_CSylgLRLkr8Rs4VFAzibutrxcNQmo-hU7bLAN44kSCGDFhddxsrO3d1mT9JmXqJiUUlSW1VSxjJZjG4nS_Ve3WynioWWk4xv3njOF6ypbSF95_m4Et76u1H54QeVAWT0hXjLKmebjRkw_-glw" style="margin-left: 0px; margin-top: 0px;" width="718" /></span></span></span></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Garbage in, garbage out</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Dada a sua função central no desempenho da JVM, a coleta de lixo (GC) continua sendo um tópico de muita discussão na comunidade.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os dados da New Relic mostram mudanças distintas no uso do coletor de lixo após o Java 8. Isso não é surpreendente, considerando os padrões atualizados e o maior desempenho disponível com o coletor G1 no Java 11 e posterior.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">G1 é o favorito claro para aqueles que deixaram o Java 8 para trás. Outros coletores experimentais que surgiram após o Java 8 (ZGC e Shenandoah) ainda mostram um uso pequeno em sistemas de produção, mas isso é esperado, pois nenhum deles atingiu o status de pronto para produção até recentemente.</span><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 483px; overflow: hidden; width: 718px;"><img height="483" src="https://lh5.googleusercontent.com/dCN4HLHshMpvjlpFEDoemrffS37n9uVUCxLUjldht_9Xmk5vf04ltGfcRTj6max75ge0iSHR8XeLQw-S6nXfm6WCGEDI-TB5du5dNpqjLqq3A3j97eOeyZBVbB23slOQns6znb1amoAGTObjEw" style="margin-left: 0px; margin-top: 0px;" width="718" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">G1 é o favorito para aqueles que deixaram o Java 8 para trás. Outros coletores experimentais que surgiram após o Java 8 (ZGC e Shenandoah) ainda mostram um uso pequeno em sistemas de produção, mas isso é esperado, pois nenhum deles atingiu o status de pronto para produção até recentemente.</span></p><div><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Sobre a New Relic</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A New Relic é uma empresa que desenvolve uma das principais plataformas de observabilidade fornecendo aos desenvolvedores métricas, eventos, logs e rastreamentos.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A versão completa do relatório de 2022 está disponível no site da </span><a href="https://newrelic.com/resources/report/2022-state-of-java-ecosystem" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">New Relic</span></a><span face="Roboto, sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto,sans-serif" style="color: #252525; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre;"><a href="https://twitter.com/sandrogiacom" style="font-size: medium; text-align: justify; text-decoration-line: none; white-space: normal;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/VxP2607dFc-7Emb_ghVxeoLcCSaselkkn3gy0_wjbUlJnRWSrX3e-W7kxg_f4xSjiurgOz-yOCKxXcgNoTj7tUllGg3bwS6wx1Uhpb-07YpVdx-FuOFwcdEueZHdM8yOJHaZqbod" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></span></p><p><br /></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-5852811818190055182022-05-28T21:28:00.008-03:002022-05-28T21:35:50.010-03:00Java ainda é relevante?<meta content="summary" name="twitter:card"></meta>
<meta content="Java ainda é relevante?" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="https://lh5.googleusercontent.com/ouWFOaPOonAwkZT8emrTh--Ro4bmMBeidT3Q6_d_9Ut0rKqc-pPZ42Aqez72mH6zx_p2w-iboMJpvBhh3WpbLRDnEutGAPOiLHI2Rl0cLH6opwQtEZm7U1ajhb4L6ytV5L2tJI32sPSn_07Bvg" name="twitter:image"></meta>
<p> <img height="320" src="https://lh5.googleusercontent.com/ouWFOaPOonAwkZT8emrTh--Ro4bmMBeidT3Q6_d_9Ut0rKqc-pPZ42Aqez72mH6zx_p2w-iboMJpvBhh3WpbLRDnEutGAPOiLHI2Rl0cLH6opwQtEZm7U1ajhb4L6ytV5L2tJI32sPSn_07Bvg" style="font-family: Arial; font-size: 11pt; margin-left: 0px; margin-top: 0px; white-space: pre-wrap;" width="718" /></p><span id="docs-internal-guid-cff9ac1e-7fff-bdff-0f1f-c781ba6c7df5"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java ainda é relevante?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Esta é uma tradução/adaptação do artigo original em </span><a href="https://dzone.com/articles/is-java-still-relevant-in-2021-1?edition=731513" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">inglês</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java é amplamente usado de diferentes maneiras, especialmente por plataformas populares que você pode usar com frequência, como Twitter, Google, Amazon, Spotify e YouTube.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java ainda é comumente usado em nossa vida diária de diferentes maneiras. Ele toca todos os campos de desenvolvimento de software e é usado por plataformas populares que você pode usar com frequência, como Twitter, Google, Amazon, Spotify e YouTube. Com esse amplo uso, a conclusão é simples — Java veio para ficar e continuará atraindo muitos desenvolvedores por muito tempo.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Quando a tecnologia existe há anos, é provável que pareça irrelevante, não competitiva e até se torne obsoleta para algumas pessoas. Não é o caso de Java, que completa 26 anos este ano.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java não é coisa do passado — ainda está muito na moda, algo que continua a surpreender aqueles que continuam apegados à ideia de que Java é antiquado. Mesmo estatísticas e estudos recentes mostram que Java ainda está entre as linguagens de programação mais exigidas, usadas e amadas. Mas o que ainda faz com que essa tecnologia um pouco antiga permaneça competitiva? Leia para saber mais.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Novos ciclos de lançamento o colocam em demanda por um longo tempo</span></h1><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Inicialmente, novas versões do Java eram lançadas uma vez por ano – algo que prejudicava alguns desenvolvedores. Isso mudou em 2018, quando foi decidido que as novas versões serão lançadas em pequenas iterações. O novo ciclo agora coloca a comunidade Java na vanguarda da inovação, pois permite que novos recursos sejam adicionados rapidamente, testados e relançados.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Desenvolvedores Java em todo o mundo continuam a crescer</span></h1><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Após 26 anos de existência – Java ainda está indo bem – os programadores que o conhecem ainda estão em alta demanda. Eles continuarão sendo procurados por muito tempo, já que mais de 90% das empresas da <a href="https://blogs.oracle.com/oracleuniversity/post/why-does-java-remain-so-popular" target="_blank">Fortune 500</a> ainda dependem do Java para seus projetos de desenvolvimento.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Globalmente, existem mais de <a href="https://www.daxx.com/blog/development-trends/number-software-developers-world" target="_blank">8 milhões de desenvolvedores Java</a>. Isso significa que existe uma grande força de trabalho, tornando mais fácil para as empresas encontrar e contratar programadores Java qualificados. De acordo com o Indeed, o salário médio anual de um desenvolvedor java é de <a href="https://www.indeed.com/career/java-developer/salaries" target="_blank">US$ 102.597 nos Estados Unidos, mais um bônus em dinheiro de US$ 5.000 por ano.</a></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Java acompanha os tempos</span></h1><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Apesar de ser uma tecnologia madura, Java continua indo bem. Atualmente, é a segunda linguagem de programação mais popular de acordo com o <a href="https://www.tiobe.com/tiobe-index/" target="_blank">índice do TIOBE</a>. A tabela abaixo exibe as dez primeiras linguagens de programação populares de acordo com este índice.</span></p><br /><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup><col width="89"></col><col width="92"></col><col width="194"></col><col width="142"></col></colgroup><tbody><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Julho 2021</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Julho 2020</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Linguagem de Programação</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Classificações</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">1</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">1</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">C</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">11.62%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">2</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">2</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">11.17%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">3</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">3</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Python</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">10.95%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">4</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">4</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">C++</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">8.01%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">5</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">5</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">C#</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">4.83%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">6</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">6</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Visual Basic</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">4.50%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">7</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">7</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">JavaScript</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">2.71%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">8</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">8</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">PHP</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">2.58%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">9</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">9</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Assembly Language</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">2.40%</span></p></td></tr><tr style="height: 35.25pt;"><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">10</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">10</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">SQL</span></p></td><td style="border-bottom: solid #cccccc 0.75pt; border-color: rgb(204, 204, 204); border-left: solid #cccccc 0.75pt; border-right: solid #cccccc 0.75pt; border-style: solid; border-top: solid #cccccc 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 4pt 8pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 19pt; margin-top: 12pt;"><span style="font-family: Georgia; font-size: 10.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">1.53%</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Além disso, o Java está acompanhando a inovação tecnológica e as tendências de software. Algo que aqueles que estão dizendo "Java está morrendo" e "programadores java não estão mais em demanda" estão ignorando ao defender uma mudança para outras linguagens. Felizmente, estatísticas e fatos continuam a provar a ampla aplicação do Java em diferentes projetos hoje.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O uso diário de Java em várias áreas de desenvolvimento de software, big data, inteligência artificial, blockchain, mobile, Internet das coisas e desenvolvimento web também é prova de que o Java veio para ficar. <a href="https://outreach.eclipse.foundation/download-the-eclipse-iot-developer-survey-results" target="_blank">O IoT Developer Survey</a> deixa claro que os programadores de produtos de software incorporados para dispositivos IoT optam pelo Java. A principal razão por trás disso é a independência da plataforma e a natureza de alta portabilidade da linguagem Java. Como o Java é executado na Java Virtual Machine (JVM), os desenvolvedores conseguem mover códigos Java para quaisquer dispositivos, pacotes de software ou chips com a JVM pré-instalada.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Você deve escolher Java para seu próximo projeto?</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Se você ainda está cético em relação ao Java hoje, os exemplos a seguir demonstram as áreas críticas em que ele é usado.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Aplicativos Java baseados na Web</span></h2><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java quando emparelhado com Servlets, Struts, JavaServer Page, Hibernate, Spring, JavaServer Face e servidores web como Resin, servidor web Apache HTTP e Apache Tomcat é usado no design de aplicativos web. Usando essas tecnologias, você pode criar qualquer aplicativo baseado na web.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os aplicativos de comércio eletrônico também são desenvolvidos usando Java quando combinados com plataformas de comércio eletrônico de código aberto, como Broadleaf. E com o COVID-19 acelerando o comércio eletrônico e a transformação digital, a demanda por mais aplicativos de comércio eletrônico sem dúvida aumentará, criando espaço para mais desenvolvedores Java.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Uma das aplicações web significativas construídas em Java é o Gmail do Google.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Como criar aplicativos Android</span></h2><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Embora existam outras maneiras de desenvolver aplicativos Android, a maioria deles é escrita em Java usando a API Android do Google. Java Micro Edition é a estrutura usada para projetar aplicativos executados em smartphones e feature phones. Além disso, Java é compatível com Kotlin e Android Studio.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os seguintes aplicativos populares de Java no Android mostram claramente que o desenvolvimento de aplicativos Android continuará sendo principalmente Java.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><ul style="text-align: left;"><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Twitter</span></li><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Spotify</span></li><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">CashApp, anteriormente conhecido como Square Cash</span></li><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Sinal</span></li></ul><p></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Sistemas Embarcados</span></h2><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os sistemas embarcados estão em toda parte. De nossos smartphones e computadores a TVs e sistemas de motor, você os encontrará executando funções dedicadas para sistemas maiores. Esses sistemas usam Java para desenvolvimento. Na verdade, Java foi propositalmente projetado para desenvolver sistemas embarcados. Aplicações comuns incluem:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><ul style="text-align: left;"><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Cartões inteligentes</span></li><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Cartões SIM em nossos telefones</span></li><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Medidores de utilidade</span></li><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Televisão</span></li><li><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Discos Blu-ray.</span></li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Todos esses são dispositivos dos quais dependemos todos os dias de uma forma ou de outra. Isso significa que o mundo precisa de desenvolvedores Java para que esses e mais produtos sejam criados e mantidos.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Tecnologias de Big Data</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">As tecnologias de big data são um dos tópicos mais em voga no mundo atual. Todas essas tecnologias, incluindo Apache Hadoop, Apache Mahout e Apache, usam Java de uma forma ou de outra. Portanto, dominar Java é uma vantagem se estiver interessado em big data.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Aplicativo baseado em nuvem</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java também se encaixa perfeitamente na computação em nuvem. Ele ajuda a desenvolver aplicativos usados em infraestrutura como serviço, plataforma como serviço e software como serviço. A nuvem Oracle Java é um excelente exemplo de ferramenta de desenvolvimento em nuvem que ajuda a projetar e configurar servidores Oracle. Agora, considerando que a <a href="https://www2.deloitte.com/us/en/insights/industry/technology/why-organizations-are-moving-to-the-cloud.html" target="_blank">nuvem continua sendo um alvo crítico</a> para empresas que buscam continuidade de negócios, maior escalabilidade e eficiência de custos, o mesmo acontecerá com a demanda por desenvolvedores Java para ajudar a realizar essa transição.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Aplicativos de jogos</span></h2><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Jogos Android não podem ser construídos sem Java. Eles são feitos com Java como linguagem principal porque suporta a Dalvik Virtual Machine que roda na plataforma Android. Java também suporta jMonkeyEngine, um motor 3D robusto com capacidade para criar jogos 3D.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Com a epidemia <a href="https://www.businessofapps.com/insights/mobile-gaming-industry-statistics-and-trends-for-2021/" target="_blank">impulsionando o crescimento da indústria de jogos para dispositivos móveis</a> em 2020, você pode esperar que a demanda seja muito maior, divertida e imersiva em 2021.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Ferramentas de software</span></h2><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">As ferramentas de software ajudam os programadores a desenvolver, analisar, depurar, manter e dar suporte a outros programas. A maioria dos programadores confia em Java para escrever e construir ferramentas de software. Eclipse, NetBeans IDE e IntelliJ IDEA são algumas das ferramentas de software comumente usadas pelos desenvolvedores. O suporte dos desenvolvedores Java será fundamental para manter a funcionalidade dessas ferramentas este ano e além.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Artigo original em </span><a href="https://dzone.com/articles/is-java-still-relevant-in-2021-1?edition=731513" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">inglês</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><a href="https://twitter.com/sandrogiacom" style="font-family: "Times New Roman"; font-size: medium; text-decoration-line: none; white-space: normal;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/VxP2607dFc-7Emb_ghVxeoLcCSaselkkn3gy0_wjbUlJnRWSrX3e-W7kxg_f4xSjiurgOz-yOCKxXcgNoTj7tUllGg3bwS6wx1Uhpb-07YpVdx-FuOFwcdEueZHdM8yOJHaZqbod" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></span></p></span><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-52806484479751228002022-03-02T10:14:00.002-03:002022-05-30T12:14:14.224-03:00Uma questão de interpretação: de bytecodes a código de máquina na JVM<div class="separator"><p style="margin-left: 1em; margin-right: 1em;"> <img src="https://lh6.googleusercontent.com/EHC0jLBs9i15RpNsFseoQ4-LHE15HSKopJElv-fgl23HtR8mzgP3r55D8Vhnlyp2uYbld1rgbg4YhP0sT4tBiB6rmsNQDtpSvzFf6HVTZYEPoRhRAiqsgOvoD5XkiGKEnDQI8AnG=s16000" style="font-family: Arial; font-size: 11pt; margin-left: 0px; margin-top: 0px; text-align: center; white-space: pre-wrap;" /></p></div><meta content="summary" name="twitter:card"></meta>
<meta content="De bytecodes a código de máquina na JVM" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="Uma questão de interpretação: de bytecodes a código de máquina na JVM" name="twitter:description"></meta>
<meta content="https://lh6.googleusercontent.com/EHC0jLBs9i15RpNsFseoQ4-LHE15HSKopJElv-fgl23HtR8mzgP3r55D8Vhnlyp2uYbld1rgbg4YhP0sT4tBiB6rmsNQDtpSvzFf6HVTZYEPoRhRAiqsgOvoD5XkiGKEnDQI8AnG=s16000" name="twitter:image"></meta>
<span id="docs-internal-guid-6e25cde3-7fff-00ae-6f76-81f4c5f9d8b1"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Uma questão de interpretação: de bytecodes a código de máquina na JVM</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
Esta é uma tradução/adaptação do artigo original em </span><a href="https://www.azul.com/blog/a-matter-of-interpretation-from-bytecodes-to-machine-code-in-the-jvm/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">inglês</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">No </span><a href="https://www.guiadojava.com.br/2022/02/compreendendo-compilacao-java.html" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">primeiro artigo desta série</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, vimos como os aplicativos baseados em JVM usam um conjunto de instruções virtuais na forma de bytecodes para criar um aplicativo de plataforma neutra. A JVM converte esses bytecodes no tempo de execução nas instruções para a plataforma na qual o aplicativo está sendo executado.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Antes de nos aprofundarmos na compilação just-in-time (JIT), vamos ver como a JVM começa a executar bytecodes usando um interpretador.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A ideia básica do interpretador é simples. Cada método, começando com public static void main(), possui um conjunto de bytecodes que definem o que ele fará. A JVM interpretará o primeiro bytecode (assumindo que a instrução não resulta em um salto para um endereço diferente ou chamará outro método) continuará com cada bytecode em sequência. Interpretar é o processo de converter um bytecode em qualquer chamada de sistema operacional ou instruções de código de máquina necessárias para executar a ação do bytecode.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Declarar assim parece simples, mas há uma quantidade considerável de trabalho envolvido.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Vamos voltar ao programa de exemplo do post anterior que soma os números de um a dez (vamos deixar de imprimir o resultado para manter o código o mais simples possível).</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">public</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">class</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Sum</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">public</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">static</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">void</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">main</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">(String[] args) {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">int</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> sum = 0;</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">for</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">int</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> i = 1; i <= 10; i++) {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> sum += i;</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> }</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> System.out.println(sum);</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> }</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">}</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O arquivo de classe compilado contém os seguintes bytecodes (produzidos com javap -c).
</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Code:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 0: iconst_0</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 1: istore_1</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 2: iconst_1</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 3: istore_2</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 4: iload_2</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 5: bipush 10</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 7: if_icmpgt 20</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 10: iload_1</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 11: iload_2</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 12: iadd</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 13: istore_1</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 14: iinc 2, 1</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 17: goto 4</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 20: return</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Isso mostra que há 14 bytecodes a serem executados (A contagem de 20 inclui os operandos dos bytecodes). Como temos um loop, as nove instruções das posições 4 a 17 serão executadas dez vezes. Uma vez que incluímos as três instruções extras necessárias para sair do loop (posições 4 a 7), temos um total de 98 bytecodes para interpretar.
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
Aqui, então, é uma questão interessante. Se executarmos este aplicativo, quantos bytecodes serão executados?
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Para determinar isso, precisamos de uma compilação especial da JVM que forneça um nível de observabilidade maior do que o padrão. Não vou entrar em todos os detalhes de como fazer isso, mas você precisa configurar um ambiente de compilação OpenJDK usando os sinalizadores -with-debug-level=slowdebug e -with-native-debug-symbols=external. Isso fornece uma variedade de opções -XX adicionais que podem ser usadas ao iniciar a JVM. Também direi que usei o </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">jlink</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> para gerar um runtime que incluía apenas o módulo java.base, pois é tudo o que precisamos para executar a aplicação.
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
Se executarmos nosso aplicativo com java -XX:+CountBytecodes Sum, obteremos o seguinte:
</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">359058 bytecodes executed in 0.4s (0.904MHz)</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
A sério! Os 98 bytecodes esperados se transformaram em quase 360 mil!
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
O que é ainda mais confuso é que você obtém três resultados diferentes se executar o aplicativo três vezes. Tanto para os autômatos finitos determinísticos que aprendi na universidade.
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
O que está acontecendo?
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
A primeira coisa a ser observada para descobrir isso é executar o aplicativo com a opção -verbose:class. Isso fornecerá informações sobre o carregamento de classe à medida que a JVM é executada. Uma simples contagem da saída revela que 412 classes estão sendo carregadas, 409 das quais são carregadas antes da nossa classe Sum. Embora não seja necessário que uma classe seja inicializada assim que for carregada (conforme definido na Especificação JVM), neste caso, todas são. Como você pode imaginar, muitas classes requerem inicialização complexa, instanciando objetos e chamando métodos. Tudo isso resulta (como podemos ver) na execução de muitos milhares de bytecodes.
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
Demorei um pouco para descobrir por que o número de bytecodes executados varia para diferentes execuções. Embora o código que está sendo executado não esteja mudando (e, portanto, determinístico), o caminho percorrido pelo código pode ser diferente. Por exemplo, mesmo algo tão simples como o valor da hora atual pode resultar em uma ramificação diferente sendo obtida em uma instrução if.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Vamos voltar ao assunto real do post, que é como a JVM interpreta cada um desses muitos bytecodes. Como há muitas maneiras possíveis de fazer isso, discutiremos a implementação da </span><a href="https://github.com/openjdk/jdk17/tree/master/src/hotspot" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Hotspot JVM</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> no </span><a href="https://openjdk.java.net/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">OpenJDK</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">No JDK 1.0, o interpretador, como o restante da JVM, foi escrito em C e consistia em um loop while infinito. Dentro do loop havia uma instrução switch gigante, que incluía um case para cada instrução de bytecode. O loop while inicia a execução de bytecodes para um método e, quando o método retorna, sai do loop por meio de uma pausa.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt; text-align: justify;"><span style="color: #666666; font-family: Arial; font-size: 15pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O interpretador C++</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O interpretador evoluiu no JDK 1.2 (suspeito, embora não possa confirmar isso) com a mudança para o </span><a href="https://en.wikipedia.org/wiki/HotSpot_(virtual_machine)" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Hotspot JVM</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. Às vezes chamado de C++Interpreter, ele ainda usa uma enorme instrução switch, mas faz alterações para melhorar a eficiência. Por exemplo, várias funções foram incorporadas para aproveitar os recursos específicos da plataforma.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Embora o C++Interpreter ainda esteja incluído no código-fonte do OpenJDK, ele não é construído e incluído na JVM por padrão. Nesse caso, o princípio Highlander é válido e pode haver apenas um (intérprete). A única compilação que faz uso disso é a de montagem zero.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt; text-align: justify;"><span style="color: #666666; font-family: Arial; font-size: 15pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O intérprete de modelos</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O interpretador usado no OpenJDK por padrão é o </span><a href="https://en.wikipedia.org/wiki/Interpreter_(computing)#Template_Interpreter" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">interpretador de modelo</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (este tem sido o padrão desde, acredito, JDK 1.4, embora, novamente, eu não tenha confirmado isso). O uso de instruções case codificadas para implementar a funcionalidade de cada bytecode limita as otimizações que podem ser exploradas para uma determinada plataforma. Veremos isso mais quando analisarmos as vantagens e desvantagens da compilação AOT e JIT posteriormente nesta série.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O interpretador de modelo constrói o código do interpretador para cada bytecode quando a JVM é inicializada. Como o nome sugere, cada bytecode tem um template. A JVM pode determinar os detalhes precisos da microarquitetura em que está sendo executada e usar esse conhecimento para gerar código otimizado para cada bytecode. Esses pedaços de código são chamados de </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">codelets</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. Em vez de usar uma instrução switch, o interpretador de modelo usa uma tabela de distribuição com pontos de entrada para cada codelet gerado.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Você pode obter mais informações sobre o que o interpretador de modelo faz usando as opções de linha de comando -XX:+UnlockDiagnosticVMOptions -XX:+PrintInterpreter. Executando isso na minha compilação do JDK 17 com nosso aplicativo simples mostrou:
</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Interpreter</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">code size = 66K bytes</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">total space = 66K bytes</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">wasted space = 0K bytes</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"># of codelets = 275</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">avg codelet size = 246 bytes</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
Como você pode ver, o interpretador de modelo gera 275 codelets, que é mais do que o número de bytecodes no conjunto de instruções da JVM. Um exame mais atento mostra que, além das instruções de bytecode, há um conjunto de </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">codelets </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">para otimizar determinadas operações. Por exemplo, existem </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">codelets </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">para lidar com coisas como funções matemáticas padrão (sin, cos, tan, etc.)
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Há também uma série de </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">codelets </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">de atalho. Quando um campo do objeto atual é carregado por meio da referência this, sempre resulta em dois bytecodes, aload_0 seguido de getfield. Essa combinação de bytecodes resulta no valor de this sendo empurrado para a pilha e imediatamente retirado novamente. Neste caso, a JVM fornece uma pseudo-instrução, </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">fast_agetfield</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, que elimina o push-pop redundante e reduz os dois bytecodes de uma operação muito comum para um. Outros codelets de atalho fazem coisas semelhantes para melhorar a eficiência de operações comuns de vários bytecodes.
</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
Há também, um tanto bizarramente, quatro </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">codelets nofast </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">que estão relacionados ao uso do recurso de compartilhamento de dados de classe (CDS).
</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
O tamanho médio dos codelets é de 246 bytes. Todos os </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">codelets </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">têm um tamanho múltiplo de 32 bytes, preenchendo com zeros quando necessário; muitos são apenas 96 bytes. Alguns, no entanto, são surpreendentemente grandes. Todo o branch se compara com zero bytecodes (ifeq, ifne, etc.), gera codelets (na minha máquina Windows com Core i7 de 9a geração) de 1376 bytes. (Eu não desmontei o código para tentar descobrir por que isso seria tão grande). Outra coisa curiosa é que o codelet para no-op é de 96 bytes!
</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
O impacto deste modelo, abordagem de geração de código em tempo real, é substancial. Volker Simonis fez uma </span><a href="https://web.archive.org/web/20090214031632/http://weblogs.java.net/blog/simonis/archive/2007/11/template_vs_cin.html" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">comparação de referência de ambos</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, e seus resultados mostraram que o interpretador de modelo era (em termos gerais) duas vezes mais rápido que o interpretador C++ mais simples.
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
Certamente, faria sentido armazenar em cache o código gerado pelo modelo para reduzir o tempo de inicialização da JVM? De maneira útil, podemos ver quanto tempo leva para gerar todos os codelets usando o sinalizador -Xlog:startuptime. Para nossa aplicação, os resultados na minha máquina são:
</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">java -Xlog:startuptime Sum</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.007s][info][startuptime] StubRoutines generation 1, 0.0002250 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.014s][info][startuptime] Genesis, 0.0069230 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.015s][info][startuptime] Interpreter generation, 0.0005353 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.015s][info][startuptime] StubRoutines generation 2, 0.0001260 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.015s][info][startuptime] MethodHandles adapters generation, 0.0000212 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.015s][info][startuptime] Start VMThread, 0.0002540 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.024s][info][startuptime] Initialize java.lang classes, 0.0082586 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.024s][info][startuptime] Initialize java.lang.invoke classes, 0.0001236 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.031s][info][startuptime] Initialize </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">module</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> system, 0.0069481 secs</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[0.032s][info][startuptime] Create VM, 0.0282268 secs</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
A geração do interpretador levou apenas 0,5 ms, portanto, mesmo reduzindo isso para zero, não teria impacto perceptível no tempo de inicialização.
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
Lembro-me de quando o Java foi lançado e começou a se tornar popular. Um dos argumentos que as pessoas tinham contra a plataforma era que ela era muito lenta em comparação com as linguagens tradicionais compiladas estaticamente como C e C++. O que, naquela época, era. Como vimos, o interpretador só se preocupa com um único bytecode (ou possivelmente dois usando codelets de caminho rápido) por vez. Mesmo o uso de modelos não mudará esse fato. Um compilador estático analisa blocos maiores de código, como loops e métodos. Ele pode então otimizar o código gerado usando técnicas como desdobramento de loop e métodos incorporados. O intérprete nunca será capaz de igualar este nível de desempenho.
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
Para resolver isso sem sacrificar o “Write once, run anywhere”, Java adotou o uso de compilação adaptável just-in-time (JIT).
</span><span style="font-family: Arial; font-size: 13pt; white-space: pre-wrap;">
No próximo post desta série, veremos as ideias básicas da compilação JIT e examinaremos como a JVM decide quais métodos compilar e quando fazê-lo.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Artigo original em </span><a href="https://www.azul.com/blog/understanding-java-compilation-from-bytecodes-to-machine-code/?mkt_tok=NDI2LVFWRC0xMTQAAAGCU7VX-rkKhmBbmAbnwFmjfQ5a3FRJviihqwXB_lMUOyHb0YCiyZ6KqTLwX_hlniG_SrVX72qtIaUPe3OGZKWuFa2aydi2G19gPc_-Qysfjk7PX50" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">inglês</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><a href="https://twitter.com/sandrogiacom" style="font-family: "Times New Roman"; font-size: medium; text-decoration-line: none; white-space: normal;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/VxP2607dFc-7Emb_ghVxeoLcCSaselkkn3gy0_wjbUlJnRWSrX3e-W7kxg_f4xSjiurgOz-yOCKxXcgNoTj7tUllGg3bwS6wx1Uhpb-07YpVdx-FuOFwcdEueZHdM8yOJHaZqbod" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></span></p></span><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-77194194266631028782022-02-22T20:35:00.008-03:002022-02-22T20:35:58.364-03:00Java é a linguagem de programação mais requisitada em 2022<meta content="summary" name="twitter:card"></meta>
<meta content="Java é a linguagem de programação mais requisitada em 2022" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="Java é a linguagem de programação mais requisitada em 2022" name="twitter:description"></meta>
<meta content="https://lh5.googleusercontent.com/hSEnCWHy7P4WRIcdqf0qgrFFvxpafIPq-oBFxgNcqYYNQEhlvC97-BujoVKTpco701wd8Fqde24QB6Ov1bRqHpsMMAuXK8ilAPtVtqgpkGenwZiQGOL-qtxmxQjGdWeHdHowVSxz" name="twitter:image"></meta>
<p> <img height="348" src="https://lh5.googleusercontent.com/hSEnCWHy7P4WRIcdqf0qgrFFvxpafIPq-oBFxgNcqYYNQEhlvC97-BujoVKTpco701wd8Fqde24QB6Ov1bRqHpsMMAuXK8ilAPtVtqgpkGenwZiQGOL-qtxmxQjGdWeHdHowVSxz" style="font-family: Arial; font-size: 11pt; margin-left: 0px; margin-top: 0px; text-align: center; white-space: pre-wrap;" width="718" /></p><span id="docs-internal-guid-1d249a30-7fff-03d1-fdd2-e0ff9427e7f6"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java é a linguagem de programação mais requisitada em 2022: Relatório</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os cargos mais procurados no ano de 2022 são desenvolvedores </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Java, JavaScript e SQL</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, de acordo com um relatório da </span><a href="https://resources.mettl.com/research/technical-skills-trends-2022/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Mercer|Mettl</span></a></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Além de desenvolvedores Java, JavaScript e SQL, a demanda por desenvolvedores full-stack que podem trabalhar em front-end e back-end está crescendo rapidamente.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A Mercer|Mettl lançou recentemente seu “Relatório de Habilidades e Tendências Tecnológicas 2022”. Ele apresenta insights cruciais sobre habilidades e funções que devem estar em demanda do setor de tecnologia em breve. A base do relatório são os dados coletados de mais de 2 milhões de avaliações feitas em 2019-2021 pela Mercer|Mettl.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">No cenário atual, o cenário de negócios está passando por uma transformação devido ao processo de </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">digitalização</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. Consequentemente, as habilidades tecnológicas estão em constante evolução. O relatório mapeia essa mudança e apresenta descobertas críticas sobre os conjuntos de habilidades que são esperados de perfis específicos de trabalho de tecnologia nos próximos dias.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt; text-align: justify;"><span style="color: #666666; font-family: Arial; font-size: 15pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Função de trabalho mais requisitados em 2022</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Os desenvolvedores de </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Java</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, JavaScript e SQL são as funções mais procuradas em 2022, graças à enorme adoção dessas linguagens em várias organizações, revela o relatório. Além disso, o DevOps se tornou uma das funções de destaque a serem contratadas em todos os setores devido à maior ênfase na segurança de rede, rápida adoção de sistemas em nuvem e metodologias ágeis.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Habilidades de front-end como JS, HTML e CSS continuam a liderar os gráficos. No entanto, Angular, jQuery, React e Bootstrap também ganharam importância. Habilidades de back-end, como estruturas Java, C# e .NET, continuam a ganhar destaque. No entanto, Python, APIs REST, Spring e Hibernate continuam sendo opções quentes.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">No lançamento do relatório, Siddhartha Gupta, CEO da Mercer|Mettl, disse: “Nos últimos dois anos, organizações em todo o mundo perceberam a necessidade de adotar a tecnologia no centro de seus negócios. Empresas estabelecidas e startups estão usando extensivamente tecnologias como IA, ML, Blockchain e Ciências de Dados para se diferenciar. Essa revolta técnica levou a um crescimento exponencial na demanda por talentos tecnológicos de alta qualidade em várias habilidades. O relatório da MercerlMettl é um estudo das tecnologias que moldaram e moldarão o futuro de vários setores. Espero que o relatório guie os líderes do setor a definir abordagens inovadoras para contratação em 2022 e além.”</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Além dos desenvolvedores Java, JavaScript e SQL, a demanda por desenvolvedores Full-Stack que podem trabalhar em front-end e back-end está crescendo rapidamente. Além disso, quando se trata de habilidades de ciência de dados – SQL, AWS e Azure ganharam importância devido à importância estratégica da análise de dados e ao aumento do uso de sistemas em nuvem. Python, que é amplamente utilizado em programação web, automação, visualização de dados e ciência de dados, tornou-se uma das linguagens mais populares.</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Artigo original em </span><a href="https://www-dqindia-com.cdn.ampproject.org/v/s/www.dqindia.com/java-is-the-most-in-demand-job-role-in-2022-report/amp/?amp_js_v=a6&amp_gsa=1#referrer=https%3A%2F%2Fwww.google.com&amp_tf=From%20%251%24s&ampshare=https%3A%2F%2Fwww.dqindia.com%2Fjava-is-the-most-in-demand-job-role-in-2022-report%2F" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">inglês</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 89px; overflow: hidden; width: 200px;"><img height="89" src="https://lh6.googleusercontent.com/VxP2607dFc-7Emb_ghVxeoLcCSaselkkn3gy0_wjbUlJnRWSrX3e-W7kxg_f4xSjiurgOz-yOCKxXcgNoTj7tUllGg3bwS6wx1Uhpb-07YpVdx-FuOFwcdEueZHdM8yOJHaZqbod" style="margin-left: 0px; margin-top: 0px;" width="200" /></span></span></a></p><div><br /></div></span><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com1tag:blogger.com,1999:blog-6448280182389226496.post-66930173625455022882022-02-18T21:32:00.021-03:002022-02-19T18:37:12.977-03:00JDK 18: Os novos recursos do Java 18<meta content="summary" name="twitter:card"></meta>
<meta content="Os novos recursos do Java 18" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="Os novos recursos do Java 18" name="twitter:description"></meta>
<meta content="https://lh5.googleusercontent.com/HmTvY_m2UWLEIqvXYOCCLS4kVUNomTy8jc9a5hVasWyFC3TcvRHoCmLjPIrMxoBXOWoeIJf3p6qz20GIzOTqVhDTDyPLRuS-I5PfgdOOuv60rztqOgGlPPoBXOp5mvpxtDj5XWnh" name="twitter:image"></meta>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span style="border: none; display: inline-block; height: 425px; overflow: hidden; width: 718px;"><img height="425" src="https://lh5.googleusercontent.com/HmTvY_m2UWLEIqvXYOCCLS4kVUNomTy8jc9a5hVasWyFC3TcvRHoCmLjPIrMxoBXOWoeIJf3p6qz20GIzOTqVhDTDyPLRuS-I5PfgdOOuv60rztqOgGlPPoBXOp5mvpxtDj5XWnh" style="margin-left: 0px; margin-top: 0px;" width="718" /></span></span></p><p><span style="font-family: Arial; font-size: 26pt; white-space: pre-wrap;">
JDK 18: Os novos recursos do Java 18</span></p><span style="font-family: helvetica;"><br />Com o lançamento em março, o <b>Java 18</b> incuba uma <b>API vetorial</b>, disponibiliza o “pattern matching for switch statements” como preview feature, adota <b>UTF-8 </b>como o conjunto de caracteres padrão e inclui um <b>servidor web</b> simples. <br /><br />O Java Development Kit (JDK) 18 está programado para ser lançado em 22 de março de 2022. A nova versão do Java padrão terá nove novos recursos, com o conjunto de recursos congelado em 9 de dezembro. <br /><br />O <b>JDK 18</b> passou para um estágio de release candidate, após duas fases de rampdown realizadas entre dezembro e fevereiro. Um segundo release candidate está previsto para 24 de fevereiro. As atualizações do Java padrão são lançadas a cada seis meses, com a versão mais recente, <a href="https://www.guiadojava.com.br/2021/09/java-17.html">JDK 17</a>, chegando em setembro de 2021.</span><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /><span style="font-family: helvetica;">A página <a href="https://openjdk.java.net/projects/jdk/18/">OpenJDK</a> lista os seguintes recursos como direcionados oficialmente ao JDK 18: uma interface de provedor de serviços, um servidor web simples, uma terceira incubação da API vetorial, trechos de código, uma reimplementação do core reflexão, um conjunto de caracteres UTF-8, uma segunda versão preview de uma função estrangeira e API de memória, uma segunda preview de correspondência de padrões para instruções switch (pattern matching for switch statements) e a descontinuação do finalization, que foi a última adição.</span></span></p><br /><span style="font-family: helvetica;">Enquanto o <a href="https://www.guiadojava.com.br/2021/09/java-17.html">JDK 17</a> foi uma versão de suporte de longo prazo (LTS) que recebeu pelo menos oito anos de suporte da Oracle, o JDK 18 será uma versão de recurso de curto prazo com suporte por seis meses. As compilações de acesso antecipado do JDK 18 podem ser encontradas para Linux, Windows e MacOS em <a href="https://jdk.java.net/18/">java.net</a>.</span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="color: #666666;"><span style="font-size: 15pt;">As especificidades das propostas do JDK 18 incluem:</span><span style="font-size: 20px;">
</span></span></span><span style="font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="color: #666666;"><span style="font-size: 20px;">
</span></span></span><span style="font-family: helvetica;">1 - <a href="http://openjdk.java.net/jeps/421">Deprecate finalization for removal</a> para remoção em uma versão futura. O Finalizer tem falhas que causam problemas significativos do mundo real em segurança, desempenho, confiabilidade e capacidade de manutenção. Ele também tem um modelo de programação difícil. A finalização está habilitada por padrão por enquanto, mas pode ser desabilitada para facilitar os testes iniciais. Ele será desabilitado por padrão em uma versão de recurso e removido completamente em uma versão posterior. A proposta exige uma opção de linha de comando para desativar a finalização e a descontinuação de todos os finalizadores e métodos de finalização na API Java padrão. Os objetivos da proposta incluem ajudar os desenvolvedores a entender os perigos da finalização, preparar os desenvolvedores para sua eventual remoção e fornecer ferramentas simples para ajudar a detectar a dependência da finalização. Introduzida no Java 1.0, a finalização visava ajudar a evitar vazamentos de recursos. Uma classe pode declarar um finalizador — o método protected void finalize() — cujo corpo libera qualquer recurso subjacente. O coletor de lixo agendará o finalizador de um objeto inacessível para ser chamado antes de recuperar a memória do objeto; por sua vez, o método finalize pode executar ações como chamar o fechamento do objeto. Isso parece ser uma rede de segurança eficaz para evitar vazamentos de recursos, mas existem falhas, incluindo latência imprevisível, com um longo tempo decorrido entre quando um objeto se torna inacessível e quando seu finalizador é chamado; comportamento irrestrito, com código finalizador capaz de realizar qualquer ação, incluindo ressuscitar um objeto e torná-lo acessível novamente; o finalizador está sempre habilitado, sem mecanismo de registro explícito; e os finalizadores podem ser executados em threads não especificados em uma ordem arbitrária. Dados os problemas com a finalização, os desenvolvedores são aconselhados a usar técnicas alternativas para evitar vazamentos de recursos, ou seja, declarações try-with-resources e limpadores. (Consulte a Proposta de Aprimoramento do JDK 421 para obter detalhes.) <br /><br />2 - Para o <a href="https://openjdk.java.net/jeps/418">Internet-address resolution SPI</a>, a proposta é definir um SPI para resolução de endereços de host e nome para que Inet.Address possa fazer uso de resolvedores diferentes do resolvedor interno da plataforma. As motivações para este esforço incluem uma melhor habilitação do <a href="https://wiki.openjdk.java.net/display/loom/Main">Project Loom</a>, para concorrência e novos modelos de programação em Java, juntamente com a integração de novos protocolos de rede, customização e habilitação de testes. A proposta não envolve o desenvolvimento de um resolvedor alternativo para o JDK. <br /><br />3 - O segundo preview do (<a href="http://openjdk.java.net/jeps/420">pattern matching for switch</a>), na qual a linguagem Java seria aprimorada com correspondência de padrões para expressões e instruções switch, juntamente com extensões para a linguagem de padrões. Isso foi visualizado no <a href="https://www.guiadojava.com.br/2021/09/java-17.html">JDK 17</a>. Estendendo a correspondência de padrões para switch que permite que uma expressão seja testada em vários padrões, cada um com uma ação específica, de modo que consultas complexas orientadas a dados possam ser expressas de forma concisa e segura. <br /><br />4 - <a href="https://openjdk.java.net/jeps/416">A reimplementação do core de reflexão com identificadores de método</a> reimplementaria lang.reflect.Method, Constructor e Field sobre os identificadores de método java.lang.invoke. Ter alças de método servindo como mecanismo subjacente para reflexão reduzirá os custos de manutenção e desenvolvimento das APIs java.lang.reflect e java.lang.invoke. <br /><br />5 - <a href="https://openjdk.java.net/jeps/408">Com a proposta de servidor web simples</a>, uma ferramenta de linha de comando seria fornecida para iniciar um servidor web mínimo que serve apenas arquivos estáticos. Nenhuma funcionalidade semelhante a CGI ou servlet está disponível. A ferramenta será útil para prototipagem, codificação ad-hoc e testes, particularmente em contextos educacionais. Os objetivos do plano incluem oferecer um servidor de arquivos HTTP estático pronto para uso com configuração fácil e funcionalidade mínima, reduzindo a energia de ativação do desenvolvedor e tornando o JDK mais acessível e fornecendo uma implementação padrão por meio da linha de comando junto com uma pequena API para criação e personalização programática. Fornecer um servidor rico em recursos ou de nível comercial não é um objetivo da proposta. <br /><br />6 - Uma segunda preview de uma <a href="https://openjdk.java.net/jeps/419">API de função e memória externa</a> (foreign function and memory API), na qual uma API é introduzida por meio da qual programas Java podem interoperar com código e dados fora do tempo de execução Java. Ao invocar funções externas – código fora da JVM – e ao acessar com segurança a memória externa – memória não gerenciada pela JVM – a API permite que programas Java chamem bibliotecas nativas e processem dados nativos sem a fragilidade e o perigo da JNI (Java Native Interface). A intenção é substituir o JNI por um modelo de desenvolvimento Java puro e superior. Essa API foi incubada no JDK 17. Para o JDK 18, refinamentos seriam incorporados, com base no feedback, como suporte para mais operadoras como Boolean e MemoryAddress em handles de var de acesso à memória e uma nova API para copiar arrays Java de e para a memória segmentos. <br /><br />7 - A <a href="https://openjdk.java.net/jeps/417">API vetorial</a> (The vector API) seria incubada pela terceira vez no JDK 18, tendo sido incubada anteriormente no JDK 16 e JDK 17. Esta proposta expressaria computações vetoriais que compilam em tempo de execução instruções vetoriais ideais em arquiteturas de CPU suportadas, alcançando desempenho superior ao equivalente cálculos escalares. As operações vetoriais expressam um grau de paralelização, permitindo que mais trabalho seja feito em um único ciclo de CPU, produzindo melhorias significativas de desempenho. A API de vetor independente de plataforma visa fornecer uma maneira de escrever algoritmos complexos em Java, usando o auto vetorizador HotSpot existente, mas com um modelo de usuário que torna a vetorização mais previsível. O JDK 18 também adicionaria suporte para a plataforma <a href="https://arxiv.org/pdf/1803.06185.pdf">ARM Scalar Vector Extension</a> e melhoraria o desempenho de operações vetoriais que aceitam máscaras em arquiteturas que suportam mascaramento em hardware. <br /><br />8 - <a href="https://openjdk.java.net/jeps/400">Specifying UTF-8 as the default charset of the standard Java APIs</a>. UTF-8 é uma codificação de caracteres de largura variável para comunicação eletrônica e é considerado o conjunto de caracteres padrão da web. Charset é a codificação de caracteres capaz de codificar todos os caracteres na web. Por meio dessa alteração, as APIs que dependem do conjunto de caracteres padrão se comportaram de forma consistente em todas as implementações, sistemas operacionais, localidades e configurações. A proposta não se destina a definir novas APIs padrão Java ou específicas de JDK. Os proponentes da proposta esperam que os aplicativos em muitos ambientes não vejam nenhum impacto da escolha do Java pelo UTF-8, já que o MacOS, muitas distribuições Linux e muitos aplicativos de servidor já suportam UTF-8. No entanto, há risco em outros ambientes, sendo o mais óbvio que os aplicativos que dependem do conjunto de caracteres padrão se comportem incorretamente ao processar dados produzidos quando o conjunto de caracteres padrão não foi especificado. A corrupção de dados pode ocorrer silenciosamente. Espera-se que o principal impacto recaia sobre os usuários de sistemas Windows em localidades asiáticas e possivelmente em alguns ambientes de servidor na Ásia e em outras localidades. <br /><br />9 - <a href="http://openjdk.java.net/jeps/413">Code snippets in Java API documentation</a>, envolvendo a introdução de uma tag @snippet para o Doclet padrão do JavaDoc, para simplificar a inclusão de código-fonte de exemplo na documentação da API. Entre os objetivos do plano está facilitar a validação de fragmentos de código-fonte, fornecendo acesso à API a esses fragmentos. Embora a correção seja de responsabilidade do autor, o suporte aprimorado em JavaDoc e ferramentas relacionadas pode torná-lo mais fácil de alcançar. Outros objetivos incluem habilitar estilos modernos, como realce de sintaxe, bem como a vinculação automática de nomes a declarações e habilitar melhor suporte de IDE para criar e editar trechos. A proposta observa que os autores da documentação da API geralmente incluem fragmentos de código-fonte nos comentários da documentação.<br /></span><span style="font-family: Arial; font-size: 13pt; text-align: left; white-space: pre;"><b>
Referências
</b></span></p><div style="text-align: left;"><span style="color: black; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline;"><b>
</b>Artigo original em </span><a href="https://www.infoworld.com/article/3630510/jdk-18-the-new-features-in-java-18.html" style="text-align: justify; text-decoration-line: none;"><span style="-webkit-text-decoration-skip: none; color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">inglês</span></a><span style="color: black; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-align: justify; vertical-align: baseline;">.</span></div><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><a href="https://twitter.com/sandrogiacom" style="text-align: left;" target="_blank"><img alt="" src="https://thepracticaldev.s3.amazonaws.com/i/gmrz82bjwhej1f1iqb1e.png" /></a></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-46968872003894106322022-02-02T21:24:00.008-03:002022-02-02T21:33:10.629-03:00Compreendendo a compilação Java<div class="separator"><p style="margin-left: 1em; margin-right: 1em;"> <img height="187" src="https://lh5.googleusercontent.com/usGrQCKUkhdJERc412WW4GpXvBJLv6ATm6FYq5lq1HM040eMfdVvi_abCCrvJtmflvNU5zISoYjzba2N45cVhUFg44XCjL49lvZ9EzIwSNWt3ksV8aEAzknAYVoS_emhbNK4-K4g=w640-h187" style="font-family: Arial; font-size: 11pt; margin-left: 0px; margin-top: 0px; text-align: center; white-space: pre-wrap;" width="640" /></p></div><meta content="summary" name="twitter:card"></meta>
<meta content="Compreendendo a compilação Java" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="Compreendendo a compilação Java: de bytecodes a código de máquina na JVM" name="twitter:description"></meta>
<meta content="https://lh5.googleusercontent.com/usGrQCKUkhdJERc412WW4GpXvBJLv6ATm6FYq5lq1HM040eMfdVvi_abCCrvJtmflvNU5zISoYjzba2N45cVhUFg44XCjL49lvZ9EzIwSNWt3ksV8aEAzknAYVoS_emhbNK4-K4g" name="twitter:image"></meta>
<span id="docs-internal-guid-7c2ba92b-7fff-f6df-7464-7c3b4f0242ea"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Compreendendo a compilação Java: de bytecodes a código de máquina na JVM</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Esta é uma tradução/adaptação do artigo original em </span><a href="https://www.azul.com/blog/understanding-java-compilation-from-bytecodes-to-machine-code/?mkt_tok=NDI2LVFWRC0xMTQAAAGCU7VX-rkKhmBbmAbnwFmjfQ5a3FRJviihqwXB_lMUOyHb0YCiyZ6KqTLwX_hlniG_SrVX72qtIaUPe3OGZKWuFa2aydi2G19gPc_-Qysfjk7PX50" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">inglês</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Para a plataforma Java, a compilação é diferente de muitas outras linguagens por causa da Java Virtual Machine (JVM). Para executar um aplicativo com a JVM, o código Java é compilado em um conjunto de arquivos de classe que contém instruções para a JVM, não o sistema operacional e o hardware em que a JVM está instalada. Isso fornece o recurso </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Write Once, Run Anywhere</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, pelo qual o Java é famoso.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como acontece essa conversão de instruções de máquina virtual para instruções nativas?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Esta não é uma pergunta simples de responder, então decidi escrever uma série de posts explorando os diferentes aspectos de interpretação e compilação adaptativa dentro da JVM.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Vamos começar com alguns conceitos fundamentais que desenvolvemos no restante da série do blog.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt;"><span style="color: #666666; font-family: Arial; font-size: 15pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Código fonte</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O que é Código Fonte?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O código-fonte são declarações e expressões de alto nível que os desenvolvedores escrevem para definir as instruções do aplicativo. Chamamos isso de alto nível porque esses tipos de linguagens de programação fornecem fortes abstrações do sistema operacional e do hardware usado para executar o aplicativo.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Exemplo de código-fonte</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como um exemplo simples, se quisermos somar os números de um a dez, poderíamos escrever isso em Java usando um loop, uma das construções fundamentais em muitas linguagens:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">public</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">class</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Sum</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">public</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">static</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">void</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">main</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">(String[] args) {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">int</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> sum = 0;</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">for</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">int</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> i = 1; i <= 10; i++) {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> sum += i;</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> }</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> System.out.println(sum);</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> }</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">}</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Isso oculta a complexidade de como um sistema operacional e um processador funcionam para os desenvolvedores. Por exemplo, podemos declarar uma variável inteira local e dar a ela um nome significativo, </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">sum</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. Isso é mais simples para nós trabalharmos do que usar um endereço de memória explícito. Da mesma forma, podemos chamar um método na classe da biblioteca principal PrintStream por meio de uma referência por meio da classe System que imprimirá uma string em qualquer que seja a saída padrão para nosso aplicativo. Como isso aparece mágicamente como caracteres em um terminal, que é controlado por um gerenciador de janelas e é desenhado na tela por meio de uma placa gráfica, não é nossa preocupação.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">No entanto, nosso código de alto nível precisa ser convertido em um conjunto de instruções numéricas e operandos que possam ser entendidos pela máquina na qual executamos a aplicação.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Para entender melhor o que está envolvido nessa conversão, podemos reescrever nosso exemplo Sum.java em uma linguagem de baixo nível. Ao contrário de uma linguagem de alto nível, isso não fornece abstrações, mas nos permite controlar o sistema operacional e o processador diretamente usando instruções que eles entendem.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Para este exemplo, vamos supor que vamos executar nosso aplicativo em uma máquina Linux com um processador x64.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Uma maneira de escrever a parte de loop do nosso aplicativo em linguagem assembly é mostrada abaixo. (Como veremos mais tarde, assim como em Java, existem várias maneiras de escrever esse código para fazer a mesma coisa).</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">section .text</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">global _start</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">_start:</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> mov eax, 1</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> mov ecx, 10</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> xor edx, edx</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">L:</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> add edx, eax</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> inc eax</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> dec ecx</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> jnz L</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">EL:</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> mov eax, 1</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> mov ebx, 0</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">int</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 0x80</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Neste código, deixei de fora a parte que imprime o resultado no final; fazer isso em assembler requer muito mais código do que para o loop.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como você pode ver, isso é consideravelmente menos legível do que em Java. Mas mesmo isso ainda é um pouco legível para os humanos. Se você entende a arquitetura básica do computador e o conjunto de instruções que está sendo usado, pode ver que a maior parte do trabalho envolve a manipulação de registradores e a execução de cálculos básicos. Tarefas mais complexas podem ser alcançadas por meio de chamadas de interrupção, como aquela no final em que usamos a interrupção 80H do Linux para invocar uma chamada de sistema para encerrar o aplicativo (sem a qual, como aprendi ao escrever este artigo, você obtém uma falha de segmentação) .</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Mesmo isso é muito alto nível para o hardware do computador. O computador precisa apenas de um fluxo de palavras de vários bytes para entender qual instrução executar com quais operandos.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Usando um montador e um linker, podemos converter o código assembly em código objeto e um executável. Isso é gerado principalmente pelo mapeamento de instruções textuais como JNZ para o valor apropriado (neste caso, 0x75). Finalmente, acabamos com um arquivo que o sistema operacional pode executar.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Nosso arquivo executável fica assim quando despejado como uma série de valores hexadecimais:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">...</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">0000160 0000 0020 0000 0000 0000 0000 0000 0000</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">0000200 01b8 0000 b900 000a 0000 d231 c201 c0ff</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">0000220 c9ff f875 01b8 0000 bb00 0000 0000 80cd</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">0000240 2e00 6873 7473 7472 6261 2e00 6574 7478</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">0000260 0000 0000 0000 0000 0000 0000 0000 0000</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">...</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Nota: este não é o arquivo completo, apenas a parte de execução do loop.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">No entanto, para nosso código Java de alto nível, não podemos mapear diretamente das instruções e expressões que usamos para instruções de máquina.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Para isso, devemos usar compilação.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 16pt; margin-top: 0pt;"><span style="color: #666666; font-family: Arial; font-size: 15pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Compilação Java</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Genericamente, a compilação é o processo de traduzir o código-fonte em código de destino usando um compilador.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como sabemos, a plataforma Java usa a JVM para executar aplicativos Java. No entanto, a JVM é um computador abstrato. A </span><a href="https://docs.oracle.com/javase/specs/jvms/se17/html/index.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">especificação JVM</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, que faz parte da </span><a href="https://www.jcp.org/en/jsr/detail?id=392" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">especificação Java SE</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, define os recursos que toda JVM deve ter (o que a JVM deve fazer). No entanto, ele não especifica detalhes da implementação desses recursos (como a JVM faz essas coisas). Esta é a razão, por exemplo, pela qual há uma variedade de algoritmos de coleta de lixo disponíveis em diferentes implementações da JVM.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Parte da especificação da JVM é uma </span><a href="https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-6.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">lista de bytecodes que definem o conjunto de instruções de nossa máquina virtual</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (abstrata). O nome bytecode vem do fato de que cada operando tem apenas um byte de tamanho. Dos 256 bytecodes possíveis, apenas 202 são usados (com mais três reservados para uso de implementação de JVM). Isso é incrível quando você pensa que o conjunto de instruções x86-64, </span><a href="https://stefanheule.com/blog/how-many-x86-64-instructions-are-there-anyway/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">que parece ser muito difícil de fornecer uma contagem precisa</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, é de aproximadamente mil.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Uma razão para a diferença significativa no tamanho do conjunto de instruções é que algumas das instruções da JVM executam tarefas complexas. Por exemplo, “</span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">invokevirtual</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">”, que invoca um método de instância. </span><a href="https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-6.html#jvms-6.5.invokevirtual" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">A descrição desta instrução</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> na especificação JVM tem cinco páginas. Outra razão é que a JVM não possui registradores explícitos e utiliza a pilha para quase todas as operações.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como um aparte, vou adicionar algumas coisas interessantes que aprendi enquanto pesquisava este post. A primeira é que a implementação da Sun da JVM (que se tornou </span><a href="https://openjdk.java.net/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">OpenJDK</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">) costumava ter 25 </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">_quick bytecodes</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> adicionais. Estes foram usados apenas internamente como substitutos para bytecodes que se referiam a entradas de pool constantes. A outra é que os primeiros desenvolvedores da JVM tiveram uma premonição sobre o bytecode </span><a href="https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-6.html#jvms-6.5.invokedynamic" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">invokedynamic</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> adicionado no JDK 7. O número de bytecode 186 foi o único valor que não foi usado inicialmente, e é precisamente onde o </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">invokedynamic</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> precisava ir.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Novamente, usando nosso exemplo Sum.java, podemos compilar isso com </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">javac </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Sum.java. O JDK também inclui uma ferramenta útil, </span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">javap</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, um desmontador de arquivos de classe. Usando a opção</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;"> -c</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, podemos imprimir os bytecodes em nosso arquivo de classe recém-compilado</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">public</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">static</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">void</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">main</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">(java.lang.String[]);</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Code:</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 0: iconst_0 </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 1: istore_1 </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 2: iconst_1</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 3: istore_2</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 4: iload_2</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 5: bipush 10</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 7: if_icmpgt 20</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 10: iload_1</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 11: iload_2</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 12: iadd</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 13: istore_1</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 14: iinc 2, 1</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 17: goto 4 </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 20: getstatic #7 </span><span face="Consolas, sans-serif" style="color: #738191; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">// Field System.out:Ljava/io/PrintStream; </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 23: iload_1</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 24: invokevirtual #13 </span><span face="Consolas, sans-serif" style="color: #738191; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">// Method PrintStream.println:(I)V</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> 27: </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">return</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como mencionado anteriormente, a JVM é baseada em pilha, portanto, em bytecodes, precisamos de 13 instruções em comparação com 7 no montador x64. Os Bytecodes gastam muito mais tempo empurrando e estourando.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Na próxima postagem desta série, veremos como os bytecodes do nosso conjunto de instruções virtuais são convertidos nas instruções nativas da plataforma de computação subjacente, que é onde começa a verdadeira diversão.</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Artigo original em </span><a href="https://www.azul.com/blog/understanding-java-compilation-from-bytecodes-to-machine-code/?mkt_tok=NDI2LVFWRC0xMTQAAAGCU7VX-rkKhmBbmAbnwFmjfQ5a3FRJviihqwXB_lMUOyHb0YCiyZ6KqTLwX_hlniG_SrVX72qtIaUPe3OGZKWuFa2aydi2G19gPc_-Qysfjk7PX50" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">inglês</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 18pt; margin-right: 18pt; margin-top: 0pt;"> </p><div><br /></div></span><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-24029629125479596772021-10-24T19:30:00.177-03:002021-10-25T11:26:04.832-03:00Diferenças entre o Java 11 e Java 17 - Pattern matching for instanceof e mais<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Java 17" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="Diferenças entre o Java 11 e Java 17 - Pattern matching for instanceof e mais" name="twitter:description"></meta>
<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/w606-h281/Java11-17.png" name="twitter:image"></meta>
<p> <span style="text-align: center;"> </span></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/s496/Java11-17.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="230" data-original-width="496" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/w606-h281/Java11-17.png" width="606" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div></div><p></p><span id="docs-internal-guid-faac5b92-7fff-cf2d-5d61-2ec47117d3d1"><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Diferenças entre Java 11 e 17 - Pattern matching for instanceof e mais</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span><span style="font-size: 17.3333px; white-space: pre-wrap;">Neste terceiro post vamos falar sobre </span><span style="font-size: 17.3333px; white-space: pre-wrap;"><b>Pattern matching for instanceof e algumas melhorias a mais</b></span><b style="font-size: 17.3333px; white-space: pre-wrap;">.</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span><span style="font-size: 17.3333px; white-space: pre-wrap;">Caso não tenha acompanhado a primeira e segundas partes, acesse</span></span></span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"> </span><a href="https://www.guiadojava.com.br/2021/10/diferencas-entre-o-java-11-e-java-17.html" style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;" target="_blank">aqui</a> <span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">e <a href="https://www.guiadojava.com.br/2021/10/diferencas-entre-o-java-11-e-java-17_17.html" target="_blank">aqui</a></span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><h1 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Pattern matching for instanceof</span></h1><div><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Freqüentemente, é necessário verificar se um objeto é de um certo tipo e, quando for, a primeira coisa a fazer é converter o objeto para uma nova variável desse certo tipo. Um exemplo pode ser visto no seguinte código: </span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">oldStyle</span>() {<br /> <span style="color: black;">Object o </span>= <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">BLUE</span>, <span style="color: #1750eb;">2</span>);<br /> <span style="color: #0033b3;">if </span>(<span style="color: black;">o </span><span style="color: #0033b3;">instanceof </span><span style="color: black;">GrapeClass</span>) {<br /> <span style="color: black;">GrapeClass grape </span>= (<span style="color: black;">GrapeClass</span>) <span style="color: black;">o</span>;<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"This grape has " </span>+ <span style="color: black;">grape</span>.getNbrOfPits() + <span style="color: #067d17;">" pits."</span>);<br /> }<br />}</pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O resultado é:</span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><i>This grape has 2 pits.</i></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Com "<i>pattern matching for instanceof</i>", o exemplo acima pode ser reescrito da seguinte maneira. Como você pode ver, é possível criar a variável na instância do check e a linha extra para criar uma nova variável e lançar o objeto, não é mais necessária.</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">patternMatching</span>() {<br /> <span style="color: black;">Object o </span>= <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">BLUE</span>, <span style="color: #1750eb;">2</span>);<br /> <span style="color: #0033b3;">if </span>(<span style="color: black;">o </span><span style="color: #0033b3;">instanceof </span><span style="color: black;">GrapeClass </span>grape) {<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"This grape has " </span>+ grape.getNbrOfPits() + <span style="color: #067d17;">" pits."</span>);<br /> }<br />}</pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O resultado é obviamente idêntico ao anterior.
É importante examinar mais de perto o escopo da variável. Não deve ser ambíguo. No código abaixo, a condição após <span style="color: #cc0000;">&&</span> só será avaliada quando a instância de verificação resultar em <span style="color: #cc0000;">true</span>. Então, isso é permitido. Mudando o <span style="color: #cc0000;">&&</span> para <span style="color: #cc0000;">||</span> não vai compilar.</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">patternMatchingScope</span>() {<br /> <span style="color: black;">Object o </span>= <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">BLUE</span>, <span style="color: #1750eb;">2</span>);<br /> <span style="color: #0033b3;">if </span>(<span style="color: black;">o </span><span style="color: #0033b3;">instanceof </span><span style="color: black;">GrapeClass </span>grape && grape.getNbrOfPits() == <span style="color: #1750eb;">2</span>) {<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"This grape has " </span>+ grape.getNbrOfPits() + <span style="color: #067d17;">" pits."</span>);<br /> }<br />}<span style="font-size: 13.5pt;"><br /></span></pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Outro exemplo sobre o escopo é mostrado no código abaixo. Se o objeto não for do tipo GrapeClass, uma RuntimeException será lançada. Nesse caso, a instrução de impressão nunca será alcançada. Nesse caso, também é possível usar a variável grape porque o compilador sabe com certeza que a grape existe.</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">patternMatchingScopeException</span>() {<br /> <span style="color: black;">Object o </span>= <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">BLUE</span>, <span style="color: #1750eb;">2</span>);<br /> <span style="color: #0033b3;">if </span>(!(<span style="color: black;">o </span><span style="color: #0033b3;">instanceof </span><span style="color: black;">GrapeClass </span>grape)) {<br /> <span style="color: #0033b3;">throw new </span>RuntimeException();<br /> }<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"This grape has " </span>+ grape.getNbrOfPits() + <span style="color: #067d17;">" pits."</span>);<br />}</pre></span></div><h1 style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Helpful NullPointerExceptions</span></h1><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">As utilidades para NullPointerExceptions pouparão um valioso tempo de análise. O código a seguir resulta em uma NullPointerException.</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">public static void </span><span style="color: #00627a;">main</span>(<span style="color: black;">String</span>[] args) {<br /> <span style="color: black;">HashMap</span><<span style="color: black;">String</span>, <span style="color: black;">GrapeClass</span>> <span style="color: black;">grapes </span>= <span style="color: #0033b3;">new </span>HashMap<>();<br /> <span style="color: black;">grapes</span>.put(<span style="color: #067d17;">"grape1"</span>, <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">BLUE</span>, <span style="color: #1750eb;">2</span>));<br /> <span style="color: black;">grapes</span>.put(<span style="color: #067d17;">"grape2"</span>, <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">white</span>, <span style="color: #1750eb;">4</span>));<br /> <span style="color: black;">grapes</span>.put(<span style="color: #067d17;">"grape3"</span>, <span style="color: #0033b3;">null</span>);<br /> <span style="color: #0033b3;">var </span><span style="color: black;">color </span>= ((<span style="color: black;">GrapeClass</span>) <span style="color: black;">grapes</span>.get(<span style="color: #067d17;">"grape3"</span>)).getColor();<br />}<span style="font-size: 13.5pt;"><br /></span></pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Com o Java 11, a saída mostrará o número da linha onde ocorre a NullPointerException, mas você não sabe qual método encadeado é resolvido como nulo. Você tem que descobrir por si mesmo por meio da depuração.</span></div><div style="text-align: justify;"><span style="color: #e69138; font-family: Arial; font-size: x-small; white-space: pre-wrap;"><br /></span></div><div style="text-align: left;"><span style="color: #e69138; font-family: courier; font-size: x-small; white-space: pre-wrap;">Exception in thread "main" java.lang.NullPointerException at com.mydeveloperplanet.myjava17planet.HelpfulNullPointerExceptions.main(HelpfulNullPointerExceptions.java:13)</span></div><div style="text-align: left;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Com Java 17, o mesmo código resulta na saída a seguir, que mostra exatamente onde ocorreu a <span style="color: #cc0000;">NullPointerException</span>.</span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></div><div style="text-align: justify;"><div style="text-align: left;"><span style="color: #ffa400; font-family: courier; font-size: small; white-space: pre-wrap;">Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.mydeveloperplanet.myjava17planet.GrapeClass.getColor()" because the return value of "java.util.HashMap.get(Object)" is null</span></div><span style="color: #ffa400; font-family: courier; font-size: x-small; white-space: pre-wrap;"><div style="text-align: left;"> at com.mydeveloperplanet.myjava17planet.HelpfulNullPointerExceptions.main(HelpfulNullPointerExceptions.java:13)</div></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></div><h1 style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Compact Number Formatting Support</span></h1><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Um método de fábrica (factory method) é adicionado a </span><span style="color: #cc0000; font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">NumberFormat</span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"> para formatar números de forma compacta e legível de acordo com o padrão Unicode. O estilo de formato SHORT é mostrado no código abaixo:</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: black;">NumberFormat fmt </span>= <span style="color: black;">NumberFormat</span>.<span style="font-style: italic;">getCompactNumberInstance</span>(<span style="color: black;">Locale</span>.<span style="color: #871094; font-style: italic;">ENGLISH</span>,<br /> <span style="color: black;">NumberFormat</span>.<span style="color: black;">Style</span>.<span style="color: #871094; font-style: italic;">SHORT</span>);<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">fmt</span>.format(<span style="color: #1750eb;">1000</span>));<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">fmt</span>.format(<span style="color: #1750eb;">100000</span>));<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">fmt</span>.format(<span style="color: #1750eb;">1000000</span>));</pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O resultado é:</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #1750eb;">1</span>K<br /><span style="color: #1750eb;">100</span>K<br /><span style="color: #1750eb;">1</span>M</pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O estilo de formato <span style="color: #cc0000;">LONG</span>:</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: black;">NumberFormat fmt </span>= <span style="color: black;">NumberFormat</span>.<span style="font-style: italic;">getCompactNumberInstance</span>(<span style="color: black;">Locale</span>.<span style="color: #871094; font-style: italic;">ENGLISH</span>,<br /> <span style="color: black;">NumberFormat</span>.<span style="color: black;">Style</span>.<span style="color: #871094; font-style: italic;">LONG</span>);<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">fmt</span>.format(<span style="color: #1750eb;">1000</span>));<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">fmt</span>.format(<span style="color: #1750eb;">100000</span>));<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">fmt</span>.format(<span style="color: #1750eb;">1000000</span>));</pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O resultado é:</span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #1750eb;">1 </span>thousand<br /><span style="color: #1750eb;">100 </span>thousand<br /><span style="color: #1750eb;">1 </span>million</pre></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Caso queira exibir os resultados em <b><span style="color: #cc0000;">Portugues do Brasil</span></b>, basta utilizar a localidade específica:</span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: black;">NumberFormat fmt </span>= <span style="color: black;">NumberFormat</span>.<span style="font-style: italic;">getCompactNumberInstance</span>(<span style="color: black;">Locale</span>.<span style="font-style: italic;">forLanguageTag</span>(<span style="color: #067d17;">"pt-BR"</span>),<br /> <span style="color: black;">NumberFormat</span>.<span style="color: black;">Style</span>.<span style="color: #871094; font-style: italic;">LONG</span>);</pre></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">O resultado é:</span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #1750eb;">1 </span>mil<br /><span style="color: #1750eb;">100 </span>mil<br /><span style="color: #1750eb;">1 </span>milhão</pre></div><h1 style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Suporte para o período do dia adicionado (Day Period)</span></span></h1><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Um novo padrão <span style="color: #cc0000;">B</span> é adicionado para formatar um <span style="color: #cc0000;">DateTime</span> que indica um período de dia de acordo com o padrão <a href="https://unicode-org.github.io/cldr-staging/charts/38/supplemental/day_periods.html" target="_blank">Unicode</a>.
Com o Locale inglês padrão, imprima vários momentos do dia:</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: black;">DateTimeFormatter dtf </span>= <span style="color: black;">DateTimeFormatter</span>.<span style="font-style: italic;">ofPattern</span>(<span style="color: #067d17;">"B"</span>);<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">dtf</span>.format(<span style="color: black;">LocalTime</span>.<span style="font-style: italic;">of</span>(<span style="color: #1750eb;">8</span>, <span style="color: #1750eb;">0</span>)));<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">dtf</span>.format(<span style="color: black;">LocalTime</span>.<span style="font-style: italic;">of</span>(<span style="color: #1750eb;">13</span>, <span style="color: #1750eb;">0</span>)));<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">dtf</span>.format(<span style="color: black;">LocalTime</span>.<span style="font-style: italic;">of</span>(<span style="color: #1750eb;">20</span>, <span style="color: #1750eb;">0</span>)));<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">dtf</span>.format(<span style="color: black;">LocalTime</span>.<span style="font-style: italic;">of</span>(<span style="color: #1750eb;">23</span>, <span style="color: #1750eb;">0</span>)));<br /><span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">dtf</span>.format(<span style="color: black;">LocalTime</span>.<span style="font-style: italic;">of</span>(<span style="color: #1750eb;">0</span>, <span style="color: #1750eb;">0</span>)));</pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O resultado é:</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;">in the morning<br />in the afternoon<br />in the evening<br />at night<br />midnight</pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">E agora em Portugues do Brasil:</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: black;">DateTimeFormatter dtf </span>= <span style="color: black;">DateTimeFormatter</span>.<span style="font-style: italic;">ofPattern</span>(<span style="color: #067d17;">"B"</span>)<br /> .withLocale(<span style="color: black;">Locale</span>.<span style="font-style: italic;">forLanguageTag</span>(<span style="color: #067d17;">"pt-BR"</span>));</pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><div style="font-family: "Times New Roman"; font-size: medium; white-space: normal;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O resultado é:</span></div></span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;">da manhã<br />da tarde<br />da noite<br />da noite<br />meia-<span style="color: black;">noite</span></pre></span></div><h1 style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">Stream.toList()</span></span></h1><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Para converter um <span style="color: #cc0000;">Stream</span> em uma Lista, você precisa chamar o método <span style="color: #cc0000;">collect</span> com <span style="color: #cc0000;">Collectors.toList()</span>. Isso é bastante verboso, como pode ser visto no exemplo abaixo.</span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">oldStyle</span>() {<br /> <span style="color: black;">Stream</span><<span style="color: black;">String</span>> <span style="color: black;">stringStream </span>= <span style="color: black;">Stream</span>.<span style="font-style: italic;">of</span>(<span style="color: #067d17;">"a"</span>, <span style="color: #067d17;">"b"</span>, <span style="color: #067d17;">"c"</span>);<br /> <span style="color: black;">List</span><<span style="color: black;">String</span>> <span style="color: black;">stringList </span>= <span style="color: black;">stringStream</span>.collect(<span style="color: black;">Collectors</span>.<span style="font-style: italic;">toList</span>());<br /> <span style="color: #0033b3;">for </span>(<span style="color: black;">String s </span>: <span style="color: black;">stringList</span>) {<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">s</span>);<br /> }<br />}</pre></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">No Java 17, um método <span style="color: #cc0000;">toList</span> é adicionado, substituindo o comportamento antigo.</span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">streamToList</span>() {<br /> <span style="color: black;">Stream</span><<span style="color: black;">String</span>> <span style="color: black;">stringStream </span>= <span style="color: black;">Stream</span>.<span style="font-style: italic;">of</span>(<span style="color: #067d17;">"a"</span>, <span style="color: #067d17;">"b"</span>, <span style="color: #067d17;">"c"</span>);<br /> <span style="color: black;">List</span><<span style="color: black;">String</span>> <span style="color: black;">stringList </span>= <span style="color: black;">stringStream</span>.toList();<br /> <span style="color: #0033b3;">for </span>(<span style="color: black;">String s </span>: <span style="color: black;">stringList</span>) {<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">s</span>);<br /> }<br />}</pre></div><h1 style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Conclusão</span></h1><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Neste blog, você deu uma olhada rápida em alguns recursos adicionados desde o último lançamento LTS Java 11. Agora é sua responsabilidade começar a pensar sobre seu plano de migração para o Java 17 e uma maneira de aprender mais sobre esses novos recursos e como você pode aplicá-los em seus hábitos diários de codificação.</span></div><div style="text-align: justify;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Créditos e artigo original (em inglês)
</span></p><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b><u><a href="https://dzone.com/articles/whats-new-between-java-11-and-java-17" target="_blank">https://dzone.com/articles/whats-new-between-java-11-and-java-17</a></u></b></span></span></div><div style="text-align: justify;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p></span><p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 18pt; margin-left: 18pt; margin-top: 0pt;"><a href="https://twitter.com/sandrogiacom" style="background-color: transparent;" target="_blank"><img alt="" src="https://thepracticaldev.s3.amazonaws.com/i/gmrz82bjwhej1f1iqb1e.png" /></a></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-14795081838806236842021-10-17T19:43:00.005-03:002021-10-17T21:06:36.724-03:00Diferenças entre o Java 11 e Java 17 - Records e Sealed Classes<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Java 17" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="Diferenças entre o Java 11 e Java 17 - Records e Sealed Classes" name="twitter:description"></meta>
<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/w606-h281/Java11-17.png" name="twitter:image"></meta>
<p> <span style="text-align: center;"> </span></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/s496/Java11-17.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="230" data-original-width="496" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/w606-h281/Java11-17.png" width="606" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div></div><p></p><span id="docs-internal-guid-faac5b92-7fff-cf2d-5d61-2ec47117d3d1"><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Diferenças entre Java 11 e 17 - Records e Sealed Classes</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span><span style="font-size: 17.3333px; white-space: pre-wrap;">Neste segundo post vamos falar sobre <b>Records e Sealed Classes</b></span><b style="font-size: 17.3333px; white-space: pre-wrap;">.</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span><span style="font-size: 17.3333px; white-space: pre-wrap;">Caso não tenha acompanhado a primeira parte sobre </span></span></span><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><b>Text Blocks e Switch Expressions</b></span></span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">, está </span><a href="https://www.guiadojava.com.br/2021/10/diferencas-entre-o-java-11-e-java-17.html" style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;" target="_blank">aqui</a><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><h1 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Records</span></h1><div><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Records permitirão que você crie classes de dados imutáveis. Atualmente, você precisa, por exemplo, crie uma Classe de dados usando as funções de geração automática de seu IDE para gerar construtor, getters, hashCode, equals e toString ou você pode usar o <a href="https://mydeveloperplanet.com/2018/05/02/project-lombok-reduce-boilerplate-code/" target="_blank">Lombok</a> para essa finalidade. No final, você acaba com algum código clichê ou acaba com uma dependência do Lombok em seu projeto. </span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">public class </span><span style="color: black;">GrapeClass </span>{<br /> <span style="color: #0033b3;">private final </span><span style="color: black;">Color </span><span style="color: #871094;">color</span>;<br /> <span style="color: #0033b3;">private final int </span><span style="color: #871094;">nbrOfPits</span>;<br /><br /> <span style="color: #0033b3;">public </span><span style="color: #00627a;">GrapeClass</span>(<span style="color: black;">Color </span>color, <span style="color: #0033b3;">int </span>nbrOfPits) {<br /> <span style="color: #0033b3;">this</span>.<span style="color: #871094;">color </span>= color;<br /> <span style="color: #0033b3;">this</span>.<span style="color: #871094;">nbrOfPits </span>= nbrOfPits;<br /> }<br /><br /> <span style="color: #0033b3;">public </span><span style="color: black;">Color </span><span style="color: #00627a;">getColor</span>() {<br /> <span style="color: #0033b3;">return </span><span style="color: #871094;">color</span>;<br /> }<br /><br /> <span style="color: #0033b3;">public int </span><span style="color: #00627a;">getNbrOfPits</span>() {<br /> <span style="color: #0033b3;">return </span><span style="color: #871094;">nbrOfPits</span>;<br /> }<br /><br /> <span style="color: #9e880d;">@Override<br /></span><span style="color: #9e880d;"> </span><span style="color: #0033b3;">public boolean </span><span style="color: #00627a;">equals</span>(<span style="color: black;">Object </span>o) {<br /> <span style="color: #0033b3;">if </span>(<span style="color: #0033b3;">this </span>== o)<br /> <span style="color: #0033b3;">return true</span>;<br /> <span style="color: #0033b3;">if </span>(o == <span style="color: #0033b3;">null </span>|| getClass() != o.getClass())<br /> <span style="color: #0033b3;">return false</span>;<br /> <span style="color: black;">GrapeClass that </span>= (<span style="color: black;">GrapeClass</span>) o;<br /> <span style="color: #0033b3;">return </span><span style="color: #871094;">nbrOfPits </span>== <span style="color: black;">that</span>.<span style="color: #871094;">nbrOfPits </span>&& <span style="color: #871094;">color</span>.equals(<span style="color: black;">that</span>.<span style="color: #871094;">color</span>);<br /> }<br /><br /> <span style="color: #9e880d;">@Override<br /></span><span style="color: #9e880d;"> </span><span style="color: #0033b3;">public int </span><span style="color: #00627a;">hashCode</span>() {<br /> <span style="color: #0033b3;">return </span><span style="color: black;">Objects</span>.<span style="font-style: italic;">hash</span>(<span style="color: #871094;">color</span>, <span style="color: #871094;">nbrOfPits</span>);<br /> }<br /><br /> <span style="color: #9e880d;">@Override<br /></span><span style="color: #9e880d;"> </span><span style="color: #0033b3;">public </span><span style="color: black;">String </span><span style="color: #00627a;">toString</span>() {<br /> <span style="color: #0033b3;">return </span><span style="color: #067d17;">"GrapeClass{" </span>+<br /> <span style="color: #067d17;">"color=" </span>+ <span style="color: #871094;">color </span>+<br /> <span style="color: #067d17;">", nbrOfPits=" </span>+ <span style="color: #871094;">nbrOfPits </span>+<br /> <span style="color: #067d17;">'}'</span>;<br /> }<br />}<span style="font-size: 13.5pt;"><br /></span></pre></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Execute alguns testes com a classe GrapeClass acima. Crie duas instâncias, imprima-as, compare-as, crie uma cópia e compare esta também.</span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">oldStyle</span>() {<br /> <span style="color: black;">GrapeClass grape1 </span>= <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">BLUE</span>, <span style="color: #1750eb;">1</span>);<br /> <span style="color: black;">GrapeClass grape2 </span>= <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">WHITE</span>, <span style="color: #1750eb;">2</span>);<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 1 is " </span>+ <span style="color: black;">grape1</span>);<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 2 is " </span>+ <span style="color: black;">grape2</span>);<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 1 equals grape 2? " </span>+ <span style="color: black;">grape1</span>.equals(<span style="color: black;">grape2</span>));<br /> <span style="color: black;">GrapeClass grape1Copy </span>= <span style="color: #0033b3;">new </span>GrapeClass(<span style="color: black;">grape1</span>.getColor(), <span style="color: black;">grape1</span>.getNbrOfPits());<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 1 equals its copy? " </span>+ <span style="color: black;">grape1</span>.equals(<span style="color: black;">grape1Copy</span>));<br />}<span style="font-size: 13.5pt;"><br /></span></pre><pre style="background-color: white;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">O resultado do teste é:</span></span></pre><pre style="background-color: white;"><span style="color: #080808; font-family: JetBrains Mono, monospace;">Grape 1 is GrapeClass{color=java.awt.Color[r=0,g=0,b=255], nbrOfPits=1}
Grape 2 is GrapeClass{color=java.awt.Color[r=255,g=255,b=255], nbrOfPits=2}
Grape 1 equals grape 2? false
Grape 1 equals its copy? true</span></pre></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">A classe GrapeRecord tem a mesma funcionalidade do GrapeClass, mas é muito menos detalhada. Você cria um registro e indica quais devem ser os campos e pronto.</span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">public record </span><span style="color: black;">GrapeRecord</span>(<span style="color: black;">Color </span>color, <span style="color: #0033b3;">int </span>nbrOfPits) {<br />}</pre></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Um Record pode ser definido em seu próprio arquivo, mas por ser tão compacto, também pode defini-lo onde for necessário. O teste acima reescrito com registros torna-se o seguinte:</span></span></div><div style="text-align: justify;"><span><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; white-space: pre-wrap;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">basicRecord</span>() {<br /> <span style="color: #0033b3;">record </span><span style="color: black;">GrapeRecord</span>(<span style="color: black;">Color </span>color, <span style="color: #0033b3;">int </span>nbrOfPits) {}<br /> <span style="color: black;">GrapeRecord grape1 </span>= <span style="color: #0033b3;">new </span>GrapeRecord(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">BLUE</span>, <span style="color: #1750eb;">1</span>);<br /> <span style="color: black;">GrapeRecord grape2 </span>= <span style="color: #0033b3;">new </span>GrapeRecord(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">WHITE</span>, <span style="color: #1750eb;">2</span>);<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 1 is " </span>+ <span style="color: black;">grape1</span>);<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 2 is " </span>+ <span style="color: black;">grape2</span>);<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 1 equals grape 2? " </span>+ <span style="color: black;">grape1</span>.equals(<span style="color: black;">grape2</span>));<br /> <span style="color: black;">GrapeRecord grape1Copy </span>= <span style="color: #0033b3;">new </span>GrapeRecord(<span style="color: black;">grape1</span>.color(), <span style="color: black;">grape1</span>.nbrOfPits());<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 1 equals its copy? " </span>+ <span style="color: black;">grape1</span>.equals(<span style="color: black;">grape1Copy</span>));<br />}</pre><pre style="background-color: white;"><span style="background-color: transparent; font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">A saída é idêntica à anterior. É importante notar que as instâncias dos registros devem terminar em cópias idênticas. Adicionar funcionalidade extra em, por exemplo grape1.nbrOfPits() para fazer algum processamento e retornar um valor diferente do nbrOfPits inicial é uma má prática. É permitido, no entanto, mas você não deve fazer isso.</span></pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O construtor pode ser estendido com alguma validação de campo. Observe que a atribuição dos parâmetros aos campos do registro ocorre no final do construtor.</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">basicRecordWithValidation</span>() {<br /> <span style="color: #0033b3;">record </span><span style="color: black;">GrapeRecord</span>(<span style="color: black;">Color </span>color, <span style="color: #0033b3;">int </span>nbrOfPits) {<br /> <span style="color: #00627a;">GrapeRecord </span>{<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Parameter color=" </span>+ color + <span style="color: #067d17;">", Field color=" </span>+ <span style="color: #0033b3;">this</span>.color());<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Parameter nbrOfPits=" </span>+ nbrOfPits + <span style="color: #067d17;">", Field nbrOfPits=" </span>+ <span style="color: #0033b3;">this</span>.nbrOfPits());<br /> <span style="color: #0033b3;">if </span>(color == <span style="color: #0033b3;">null</span>) {<br /> <span style="color: #0033b3;">throw new </span>IllegalArgumentException(<span style="color: #067d17;">"Color may not be null"</span>);<br /> }<br /> }<br /> }<br /> <span style="color: black;">GrapeRecord grape1 </span>= <span style="color: #0033b3;">new </span>GrapeRecord(<span style="color: black;">Color</span>.<span style="color: #871094; font-style: italic;">BLUE</span>, <span style="color: #1750eb;">1</span>);<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Grape 1 is " </span>+ <span style="color: black;">grape1</span>);<br /> <span style="color: black;">GrapeRecord grapeNull </span>= <span style="color: #0033b3;">new </span>GrapeRecord(<span style="color: #0033b3;">null</span>, <span style="color: #1750eb;">2</span>);<br />}<span style="font-size: 13.5pt;"><br /></span></pre></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">A saída do teste acima mostra essa funcionalidade. Dentro do construtor, os valores do campo ainda são nulos, mas ao imprimir o registro, eles recebem um valor. A validação também faz o que deveria estar fazendo e lança uma IllegalArgumentException quando a cor é <span style="color: #cc0000;">nula</span>.</span></div><div style="text-align: justify;"><span style="font-family: Arial; white-space: pre-wrap;"><div style="font-family: "Times New Roman"; white-space: normal;"><span><pre style="background-color: white;"><span style="color: #080808; font-family: JetBrains Mono, monospace;">Parameter color=java.awt.Color[r=0,g=0,b=255], Field color=null
Parameter nbrOfPits=1, Field nbrOfPits=0
Grape 1 is GrapeRecord[color=java.awt.Color[r=0,g=0,b=255], nbrOfPits=1]
Parameter color=null, Field color=null
Parameter nbrOfPits=2, Field nbrOfPits=0
Exception in thread "main" java.lang.IllegalArgumentException: Color may not be null
at com.giacom.java17.records.RecordTest$1GrapeRecord.<init>(RecordTest.java:12)
at com.giacom.java17.records.RecordTest.basicRecordWithValidation(RecordTest.java:18)
at com.giacom.java17.records.RecordTest.main(RecordTest.java:22)</span></pre></span></div></span></div><h2 style="text-align: left;"><span style="font-family: Arial;"><span style="font-size: small; white-space: pre-wrap;">Sealed Classes</span></span></h2><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Classes seladas darão a você mais controle sobre quais classes podem estender sua classe. Classes seladas são provavelmente mais um recurso útil para proprietários de bibliotecas. Uma classe está no Java 11 final ou pode ser estendida. Se você deseja controlar quais classes podem estender sua superclasse, você pode colocar todas as classes no mesmo pacote e dar visibilidade ao pacote de superclasse. Tudo está sob seu controle agora, porém, não é mais possível acessar a superclasse de fora do pacote. Vamos ver como isso funciona por meio de um exemplo.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Crie uma classe abstrata <span style="color: #cc0000;">Fruit</span> com visibilidade pública em algum pacote. No mesmo pacote, são criadas as classes finais <span style="color: #cc0000;">Apple</span> e <span style="color: #cc0000;">Pear</span> que estendem <span style="color: #cc0000;">Fruit</span>.</span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">public abstract class </span><span style="color: black;">Fruit </span>{<br />}</pre></span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">public final class </span><span style="color: black;">Apple </span><span style="color: #0033b3;">extends </span><span style="color: black;">Fruit </span>{<br />}</pre></span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">public final class </span><span style="color: black;">Pear </span><span style="color: #0033b3;">extends </span><span style="color: black;">Fruit </span>{<br />}</pre></span></span></div><div style="text-align: justify;"><span style="text-align: left;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Crie em outro pacote, um arquivo <span style="color: #cc0000;">SealedClasses.java</span> com um método <span style="color: #cc0000;">problemSpace</span>. Como você pode ver, as instâncias podem ser criadas para uma <span style="color: #cc0000;">Apple</span>, uma <span style="color: #cc0000;">Pear</span> e uma <span style="color: #cc0000;">Apple</span> podem ser atribuídas a uma <span style="color: #cc0000;">Fruit</span>. Além disso, também é possível criar uma classe <span style="color: #cc0000;">Avocado</span> que estende <span style="color: #cc0000;">Fruit</span>.</span></span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">problemSpace</span>() {<br /> <span style="color: black;">Apple apple </span>= <span style="color: #0033b3;">new </span>Apple();<br /> <span style="color: black;">Pear pear </span>= <span style="color: #0033b3;">new </span>Pear();<br /> <span style="color: black;">Fruit fruit </span>= <span style="color: black;">apple</span>;<br /> <span style="color: #0033b3;">class </span><span style="color: black;">Avocado </span><span style="color: #0033b3;">extends </span><span style="color: black;">Fruit </span>{<br /> }<br />}</pre></span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Suponha que você não deseja que alguém estenda uma <span style="color: #cc0000;">Fruit</span>. Nesse caso, você pode alterar a visibilidade da fruta para a visibilidade padrão (remova a palavra-chave <span style="color: #cc0000;">puclic</span>). O código acima não será mais compilado na atribuição de <span style="color: #cc0000;">Apple</span> a <span style="color: #cc0000;">Fruit</span> e na criação da classe <span style="color: #cc0000;">Avocado</span>. O último é desejado, mas queremos que uma <span style="color: #cc0000;">Apple</span> possa ser atribuída a uma <span style="color: #cc0000;">Fruit</span>. Isso pode ser resolvido em Java 17 com classes seladas.</span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">No pacote que serão criadas as versões seladas de <span style="color: #cc0000;">FruitSealed</span>, <span style="color: #cc0000;">AppleSealed</span> e <span style="color: #cc0000;">PearSealed</span>. A única coisa a fazer é adicionar a palavra-chave <span style="color: #cc0000;">sealed</span> à classe <span style="color: #cc0000;">Fruit</span> e indicar com a palavra-chave <span style="color: #cc0000;">permits</span> quais classes podem estender essa Classe Selada. As subclasses precisam indicar se são <span style="color: #cc0000;">final</span>, <span style="color: #cc0000;">sealed</span> ou <span style="color: #cc0000;">non-sealed</span>. A superclasse não pode controlar se uma subclasse pode ser estendida e como pode ser estendida.</span></span></div><div style="text-align: justify;"><span><span style="font-family: Arial; white-space: pre-wrap;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><pre style="font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">abstract sealed class </span><span style="color: black;">FruitSealed </span><span style="color: #0033b3;">permits </span><span style="color: black;">AppleSealed</span>, <span style="color: black;">PearSealed </span>{<br />}<br /></pre><pre style="font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">public non-sealed class </span><span style="color: black;">AppleSealed </span><span style="color: #0033b3;">extends </span><span style="color: black;">FruitSealed </span>{<br />}</pre><pre style="font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">public final class </span><span style="color: black;">PearSealed </span><span style="color: #0033b3;">extends </span><span style="color: black;">FruitSealed </span>{<br />}<span style="font-size: 13.5pt;"><br /></span></pre></pre></span></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">No método </span></span><span style="background-color: white; color: #00627a; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;">problemSpace</span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">, ainda é possível atribuir um AppleSealed a um FruitSealed, mas o Avocado não tem permissão para estender o FruitSealed. No entanto, é permitido estender AppleSealed porque esta subclasse é indicada como <span style="color: #cc0000;">non-sealed</span>.</span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">sealedClasses</span>() {<br /> <span style="color: black;">AppleSealed apple </span>= <span style="color: #0033b3;">new </span>AppleSealed();<br /> <span style="color: black;">PearSealed pear </span>= <span style="color: #0033b3;">new </span>PearSealed();<br /> <span style="color: black;">FruitSealed fruit </span>= <span style="color: black;">apple</span>;<br /> <span style="color: #0033b3;">class </span><span style="color: black;">Avocado </span><span style="color: #0033b3;">extends </span><span style="color: black;">AppleSealed </span>{};<br />}</pre></div><div style="text-align: justify;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Créditos e artigo original (em inglês)
</span></p><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b><u><a href="https://dzone.com/articles/whats-new-between-java-11-and-java-17" target="_blank">https://dzone.com/articles/whats-new-between-java-11-and-java-17</a></u></b></span></span></div><div style="text-align: justify;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p></span><p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 18pt; margin-left: 18pt; margin-top: 0pt;"><a href="https://twitter.com/sandrogiacom" style="background-color: transparent;" target="_blank"><img alt="" src="https://thepracticaldev.s3.amazonaws.com/i/gmrz82bjwhej1f1iqb1e.png" /></a></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-27266539619781440242021-10-09T20:39:00.004-03:002021-10-13T21:29:37.136-03:00Diferenças entre o Java 11 e Java 17 - Text Blocks e Switch Expressions<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Java 17" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="Diferenças entre o Java 11 e Java 17 - Text Blocks e Switch Expression" name="twitter:description"></meta>
<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/w606-h281/Java11-17.png" name="twitter:image"></meta>
<p> <span style="text-align: center;"> </span></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/s496/Java11-17.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="230" data-original-width="496" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlPo8WrMdQP2mTfLHcgDWwr5u8Nq9T6tNWCzgHwl2K3tNlCOWzcZw42mJFY9tRXAIG6wksS7HrUr8NZGItYF67Ilaj2rPiBxScYLAoG3U_nvGo1vhjJ0UTXaieUVNuTNzGG-Kaq4DI5LC6/w606-h281/Java11-17.png" width="606" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div></div><p></p><span id="docs-internal-guid-faac5b92-7fff-cf2d-5d61-2ec47117d3d1"><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Diferenças entre Java 11 e 17 - Text Blocks e Switch Expressions</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Aprenda as diferenças entre o Java 11 e o Java 17. Obtenha uma visão geral do modelo de licenciamento e exemplos dos novos recursos do Java 17. Neste primeiro post vamos falar sobre <b>Text Blocks e Switch Expressions.</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Em 14 de setembro, o <a href="https://www.guiadojava.com.br/2021/09/java-17.html" target="_blank">Java 17 foi lançado</a>. É hora de dar uma olhada mais de perto nas mudanças desde o último lançamento do LTS, que é o Java 11. É feita uma breve introdução sobre o modelo de licenciamento e, em seguida, algumas das mudanças entre o Java 11 e o Java 17 são destacadas, principalmente por meio de exemplos.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><h2 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Introdução</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Primeiro, vamos dar uma olhada no modelo de licenciamento e suporte Java. O Java 17 é uma versão LTS (Long Term Support), assim como o Java 11. Com o Java 11, uma nova cadência de lançamento começou. Java 11 veio com suporte até setembro de 2023 e com suporte estendido até setembro de 2026. Além disso, com o Java 11, o Oracle JDK não era mais gratuito para produção e uso comercial. A cada 6 meses, uma nova versão do Java é lançada, os chamados não-LTS, desde o Java 12 até o Java 16. No entanto, esses são lançamentos prontos para produção. A única diferença com um lançamento LTS é que o suporte termina quando a próxima versão for lançada. Por exemplo, o suporte do Java 12 termina quando o Java 13 é lançado.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Você é mais ou menos obrigado a atualizar para o Java 13 quando quiser manter o suporte a atualizações e correção de bugs. Isso pode causar alguns problemas quando algumas de suas dependências ainda não estão prontas para o Java 13.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Na maioria das vezes, para uso em produção, as empresas esperam pelos lançamentos LTS. Mas, mesmo assim, algumas empresas relutam em fazer upgrade. Uma pesquisa recente da <a href="https://snyk.io/jvm-ecosystem-report-2021/" target="_blank">Snyk</a> mostrou que apenas 60% estão usando o Java 11 em produção e isso foi 3 anos após o lançamento do Java 11! O Java 8 também ainda é usado por 60% das empresas. Outra coisa interessante de se notar é que o próximo lançamento do LTS será o Java 21, que será lançado em 2 anos. Uma boa visão geral se as bibliotecas têm problemas ou não com o Java 17, pode ser encontrada <a href="https://wiki.openjdk.java.net/display/quality/Quality+Outreach" target="_blank">aqui</a>.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">O modelo de licenciamento da Oracle mudou com a introdução do Java 17. Java 17 é emitido sob a nova licença NFTC (Oracle No-Fee Terms and Conditions). Portanto, é novamente permitido usar a versão Oracle JDK gratuitamente para produção e uso comercial. Na mesma pesquisa da Snyk, constatou-se que a versão Oracle JDK só era usada por 23% dos usuários em ambiente de produção. Você deve observar que o suporte para a versão LTS terminará um ano após o lançamento da próxima versão LTS. Será interessante ver como isso influenciará a atualização para as próximas versões LTS. Você pode ver um texto mais completo <a href="https://www.guiadojava.com.br/2021/09/oracle-jdk-agora-e-livre.html" target="_blank">aqui</a>.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">O que mudou entre o Java 11 e o Java 17? Uma lista completa dos JEPs (Java Enhancement Proposals) pode ser encontrada no site do <a href="https://openjdk.java.net/projects/jdk/17/jeps-since-jdk-11" target="_blank">OpenJDK</a>. Aqui você pode ler os detalhes essenciais de cada JEP. Para obter uma lista completa do que mudou por versão desde o Java 11.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Nas próximas seções, algumas das mudanças serão explicadas, por exemplo, mas depende principalmente de você experimentar esses novos recursos para se familiarizar com eles.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><h2 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Text Blocks</span></h2><div><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Muitas melhorias foram feitas para tornar o Java mais legível e menos prolixo. Os blocos de texto definitivamente tornam o código mais legível. Primeiro, vamos dar uma olhada no problema. Suponha que você precise de alguma string JSON em seu código e precise imprimi-la. Existem vários problemas com este código:</span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"></p><ul><li><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Scape das aspas duplas;</span></span></li><li><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Concatenação de strings para torná-los mais ou menos legíveis;</span></span></li><li><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Copiar e colar JSON exige muito trabalho (provavelmente seu IDE o ajudará com esse problema).</span></span></li></ul><div><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></div><div><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Os blocos de texto são definidos com três aspas duplas, onde as três aspas duplas finais podem não estar na mesma linha da inicial.</span></span></div><div><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><pre style="font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">oldStyle</span>() {<br /> <span style="color: black;">String text </span>= <span style="color: #067d17;">"{</span><span style="color: #0037a6;">\n</span><span style="color: #067d17;">" </span>+<br /> <span style="color: #067d17;">" </span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">name</span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">: </span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">John Doe</span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">,</span><span style="color: #0037a6;">\n</span><span style="color: #067d17;">" </span>+<br /> <span style="color: #067d17;">" </span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">age</span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">: 45,</span><span style="color: #0037a6;">\n</span><span style="color: #067d17;">" </span>+<br /> <span style="color: #067d17;">" </span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">address</span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">: </span><span style="color: #0037a6;">\"</span><span style="color: #067d17;">Doe Street, 23, Java Town</span><span style="color: #0037a6;">\"\n</span><span style="color: #067d17;">" </span>+<br /> <span style="color: #067d17;">"}"</span>;<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">text</span>);<br />}</pre></pre></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">A parte problemática do JSON agora pode ser escrita da seguinte maneira, que é muito mais legível. Não há necessidade de escapar as aspas duplas e parece que será impresso.</span></span></div><div><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">jsonBlock</span>() {<br /> <span style="color: black;">String text </span>= <span style="color: #067d17;">"""<br /></span><span style="color: #067d17;"> {<br /></span><span style="color: #067d17;"> "name": "John Doe",<br /></span><span style="color: #067d17;"> "age": 45,<br /></span><span style="color: #067d17;"> "address": "Doe Street, 23, Java Town"<br /></span><span style="color: #067d17;"> }<br /></span><span style="color: #067d17;"> """</span>;<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">text</span>);<br />}</pre></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">A saída agora imprime dois espaços antes de cada linha. Isso significa que as três aspas duplas finais indicam o início do Bloco de Texto.</span></span></div><h2 style="text-align: left;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Switch Expressions</span></span></h2><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Switch Expressions permitirá que você retorne valores do switch e use esses valores de retorno em atribuições, etc. Um switch clássico é mostrado aqui, onde, dependendo de um determinado valor Fruit enum, alguma ação precisa ser realizada. De propósito, o intervalo é deixado de fora.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Chame o método com APPLE.</span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="font-style: italic;">oldStyleWithoutBreak</span>(<span style="color: black;">Fruit</span>.<span style="color: #871094; font-style: italic;">APPLE</span>);</pre></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; text-align: left; white-space: pre-wrap;">Isso imprime todos os casos porque, sem a instrução break, o caso falha.
</span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; text-align: left; white-space: pre-wrap;">Common fruit</span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; text-align: left; white-space: pre-wrap;">Exotic fruit</span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; text-align: left; white-space: pre-wrap;">Undefined fruit</span></div><div style="text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><br /></span></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">Portanto, é necessário adicionar uma instrução <span style="color: #2b00fe;">break</span> em cada caso para evitar essa falha.</span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">oldStyleWithBreak</span>(<span style="color: black;">Fruit </span>fruit) {<br /> <span style="color: #0033b3;">switch </span>(fruit) {<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">APPLE</span>, <span style="color: #871094; font-style: italic;">PEAR</span>:<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Common fruit"</span>);<br /> <span style="color: #0033b3;">break</span>;<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">ORANGE</span>, <span style="color: #871094; font-style: italic;">AVOCADO</span>:<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Exotic fruit"</span>);<br /> <span style="color: #0033b3;">break</span>;<br /> <span style="color: #0033b3;">default</span>:<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Undefined fruit"</span>);<br /> }<br />}</pre></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">A execução desse método fornece o resultado desejado, mas o código está um pouco menos legível agora.</span></span></div><div style="text-align: left;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></div><div style="text-align: left;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Common fruit</span></div><div style="text-align: left;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Isso pode ser resolvido usando Switch Expressions. Substitua os dois pontos (:) por uma seta (->) e certifique-se de que uma expressão seja usada nesse caso. O comportamento padrão de Switch Expressions é sem falhas, portanto, nenhum <span style="color: #2b00fe;">break</span> é necessário.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">withSwitchExpression</span>(<span style="color: black;">Fruit </span>fruit) {<br /> <span style="color: #0033b3;">switch </span>(fruit) {<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">APPLE</span>, <span style="color: #871094; font-style: italic;">PEAR </span>-> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Common fruit"</span>);<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">ORANGE</span>, <span style="color: #871094; font-style: italic;">AVOCADO </span>-> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Exotic fruit"</span>);<br /> <span style="color: #0033b3;">default </span>-> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"Undefined fruit"</span>);<br /> }<br />}</pre></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">Isso já é menos verboso e o resultado é idêntico.
Uma expressão de switch também pode retornar um valor. No exemplo acima, você pode retornar os valores de <span style="color: #2b00fe;">String</span> e atribuí-los a um texto variável. Depois disso, a variável de texto pode ser impressa. Não se esqueça de adicionar um ponto e vírgula após o último colchete.</span></span></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">withReturnValue</span>(<span style="color: black;">Fruit </span>fruit) {<br /> <span style="color: black;">String text </span>= <span style="color: #0033b3;">switch </span>(fruit) {<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">APPLE</span>, <span style="color: #871094; font-style: italic;">PEAR </span>-> <span style="color: #067d17;">"Common fruit"</span>;<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">ORANGE</span>, <span style="color: #871094; font-style: italic;">AVOCADO </span>-> <span style="color: #067d17;">"Exotic fruit"</span>;<br /> <span style="color: #0033b3;">default </span>-> <span style="color: #067d17;">"Undefined fruit"</span>;<br /> };<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">text</span>);<br />}</pre></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">E, ainda mais resumido, o acima pode ser reescrito em apenas uma declaração. Depende de você se isso é mais legível do que o acima.</span></span></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">withReturnValueEvenShorter</span>(<span style="color: black;">Fruit </span>fruit) {<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<br /> <span style="color: #0033b3;">switch </span>(fruit) {<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">APPLE</span>, <span style="color: #871094; font-style: italic;">PEAR </span>-> <span style="color: #067d17;">"Common fruit"</span>;<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">ORANGE</span>, <span style="color: #871094; font-style: italic;">AVOCADO </span>-> <span style="color: #067d17;">"Exotic fruit"</span>;<br /> <span style="color: #0033b3;">default </span>-> <span style="color: #067d17;">"Undefined fruit"</span>;<br /> });<br />}</pre></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">O que você faz quando precisa fazer mais do que apenas uma coisa no caso? Neste caso, você pode usar colchetes para indicar um bloco de caso e ao retornar um valor, você usa a palavra-chave <span style="color: #2b00fe;">yield</span>.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">withYield</span>(<span style="color: black;">Fruit </span>fruit) {<br /> <span style="color: black;">String text </span>= <span style="color: #0033b3;">switch </span>(fruit) {<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">APPLE</span>, <span style="color: #871094; font-style: italic;">PEAR </span>-> {<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #067d17;">"the given fruit was: " </span>+ fruit);<br /> <span style="color: #0033b3;">yield </span><span style="color: #067d17;">"Common fruit"</span>;<br /> }<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">ORANGE</span>, <span style="color: #871094; font-style: italic;">AVOCADO </span>-> <span style="color: #067d17;">"Exotic fruit"</span>;<br /> <span style="color: #0033b3;">default </span>-> <span style="color: #067d17;">"Undefined fruit"</span>;<br /> };<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: black;">text</span>);<br />}</pre></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">A saída agora é um pouco diferente, duas instruções de impressão são executadas.</span></span></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">the given fruit was: APPLE
Common fruit</span></span></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">Também é legal que você possa usar a palavra-chave <span style="color: #2b00fe;">yield</span> na 'antiga' sintaxe de switch. O <span style="color: #2b00fe;">break</span> não é necessário aqui.</span></span></div><div style="text-align: justify;"><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">private static void </span><span style="color: #00627a;">oldStyleWithYield</span>(<span style="color: black;">Fruit </span>fruit) {<br /> <span style="color: black;">System</span>.<span style="color: #871094; font-style: italic;">out</span>.println(<span style="color: #0033b3;">switch </span>(fruit) {<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">APPLE</span>, <span style="color: #871094; font-style: italic;">PEAR</span>:<br /> <span style="color: #0033b3;">yield </span><span style="color: #067d17;">"Common fruit"</span>;<br /> <span style="color: #0033b3;">case </span><span style="color: #871094; font-style: italic;">ORANGE</span>, <span style="color: #871094; font-style: italic;">AVOCADO</span>:<br /> <span style="color: #0033b3;">yield </span><span style="color: #067d17;">"Exotic fruit"</span>;<br /> <span style="color: #0033b3;">default</span>:<br /> <span style="color: #0033b3;">yield </span><span style="color: #067d17;">"Undefined fruit"</span>;<br /> });<br />}</pre></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">No próximo post continuaremos a explorar outras diferenças . Até lá.</span></span></div><div style="text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Créditos e artigo original (em inglês)
</span></p><div style="text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b><u><a href="https://dzone.com/articles/whats-new-between-java-11-and-java-17" target="_blank">https://dzone.com/articles/whats-new-between-java-11-and-java-17</a></u></b></span></span></div><div style="text-align: justify;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p></span><p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 18pt; margin-left: 18pt; margin-top: 0pt;"><a href="https://twitter.com/sandrogiacom" style="background-color: transparent;" target="_blank"><img alt="" src="https://thepracticaldev.s3.amazonaws.com/i/gmrz82bjwhej1f1iqb1e.png" /></a></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-55143834788617188362021-09-25T18:45:00.008-03:002021-09-28T21:02:43.466-03:00Oracle JDK agora é livre?<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Oracle JDK agora é livre?" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="Oracle JDK agora é livre?" name="twitter:description"></meta>
<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgho7OzV1S49rTaoHHuKptBP7uZ_v8vUSx3OjTHVtF5KKsDZKJVYu4qh-Lb3NtFw9KSZ48c5EhnOJ3Tw-PxutV3lZZXXsipJWnp0E_rT9__mSZL8X_ozpkODCgErGQBNAJxIQwRUmhpfyIp/w640-h426/FREE-LUNCH-O-Que-Significa-Almo%25C3%25A7o-Gr%25C3%25A1tis.jpg" name="twitter:image"></meta>
<p> <span style="text-align: center;"> </span></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgho7OzV1S49rTaoHHuKptBP7uZ_v8vUSx3OjTHVtF5KKsDZKJVYu4qh-Lb3NtFw9KSZ48c5EhnOJ3Tw-PxutV3lZZXXsipJWnp0E_rT9__mSZL8X_ozpkODCgErGQBNAJxIQwRUmhpfyIp/s800/FREE-LUNCH-O-Que-Significa-Almo%25C3%25A7o-Gr%25C3%25A1tis.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="533" data-original-width="800" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgho7OzV1S49rTaoHHuKptBP7uZ_v8vUSx3OjTHVtF5KKsDZKJVYu4qh-Lb3NtFw9KSZ48c5EhnOJ3Tw-PxutV3lZZXXsipJWnp0E_rT9__mSZL8X_ozpkODCgErGQBNAJxIQwRUmhpfyIp/w640-h426/FREE-LUNCH-O-Que-Significa-Almo%25C3%25A7o-Gr%25C3%25A1tis.jpg" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div></div><p></p><span id="docs-internal-guid-faac5b92-7fff-cf2d-5d61-2ec47117d3d1"><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 17.3333px; text-align: justify; white-space: pre-wrap;">Olá Javeiros e Javeiras, h</span><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">á uma boa notícia para todos os desenvolvedores Java e todos os clientes que usam Java sob uma licença comercial: o Oracle JDK está disponível gratuitamente a partir do JDK 17 (<a href="https://www.guiadojava.com.br/2021/09/java-17.html" target="_blank">publicado há poucos dias</a>).</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b>Novo modelo de licenciamento</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Informação retirada so site da <a href="https://www.oracle.com/java/technologies/downloads/" target="_blank">Oracle</a>:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">"Java 17 LTS é a versão de suporte de longo prazo mais recente para a plataforma Java SE. Os binários do JDK 17 podem ser usados gratuitamente na produção e podem ser redistribuídos, sem nenhum custo, de acordo com a <a href="https://www.oracle.com/java/technologies/javase/jdk-faqs.html" target="_blank">Licença de Termos e Condições Gratuitas da Oracle</a>."</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">O JDK 17 receberá atualizações sob esses termos, pelo menos até setembro de 2024.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Confira a notícia completa:</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><a href="https://blogs.oracle.com/oracle-brasil/post/java-gratuito" target="_blank">https://blogs.oracle.com/oracle-brasil/post/java-gratuito</a></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Esta licença gratuita inclui o JDK e as atualizações de segurança trimestrais também para uso comercial e de produção. A nova licença é a licença “Oracle No-Fee Terms and Conditions” (NFTC) e permite o uso gratuito para todos os usuários, mesmo para uso comercial e de produção. A redistribuição é permitida, desde que não seja cobrada uma taxa.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">As versões anteriores não são afetadas por esta mudança. A Oracle continuará a fornecer versões do Oracle OpenJDK sob a GPL nas mesmas versões e agendamento desde o Java 9.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Em setembro de 2017, a Oracle anunciou planos de distribuir o JDK sob a GPL como “Oracle OpenJDK” e também como Oracle JDK sob uma licença Oracle Technology Network (OTN). </span></span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O fornecimento de compilações do Oracle OpenJDK sob a GPL foi muito bem-vindo, mas o feedback dos desenvolvedores, acadêmicos e empresas foi de que eles queriam o Oracle JDK confiável e sólido sob uma licença de termos inequivocamente livre.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">"</span><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">A Oracle agradece o feedback do ecossistema de desenvolvedores e tem o prazer de anunciar que, a partir do Java 17, estamos atendendo exatamente a essa solicitação.</span></span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">"</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">A assinatura do Oracle Java SE continua a fornecer recursos de valor agregado, como o Java Management Service, o Advanced Management Console e o GraalVM Enterprise sem custo incremental.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b>Versões LTS a cada dois anos</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Outra novidade é a proposta para ter versões LTS a cada dois anos em vez de 3. Isso foi percebido por que usuários e empresas, embora utilizem as versões intermediárias, preferem não utilizar estas versões em produção e esperar por uma versão LTS.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><b style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">É de graça mesmo?</b></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Naquela história de que não existe almoço grátis, a gente já desconfia quando é grátis que existe alguma pegadinha por trás disso.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Vamos dar uma olhada no que o acordo realmente diz.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">O contrato, em primeiro lugar, afirma que o uso do Oracle Java - Release 17 é regido pelo NFTC, a menos que você tenha recebido o programa (stand-alone ou como parte de outro programa Oracle) sob outro Contrato de Licença Oracle (por exemplo, Oracle Master Agreement).</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b>Em outras palavras:</b>
Se você, como empresa, já estiver licenciado para programas Oracle Java (por exemplo, por meio de uma Assinatura Oracle Java Standard Edition ou como parte de outra licença Oracle (por exemplo, Oracle Weblogic), então sua implantação e uso do Oracle Java Release 17 NÃO são regidos pelo “ Termos e Condições Sem Taxa ”.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b>Direitos e restrições da licença:</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Caso sua empresa NÃO tenha obtido o direito de usar o Oracle Java por meio de outro contrato de licença da Oracle (o que é bastante improvável), os seguintes direitos e restrições de uso são aplicáveis para a implantação e uso do Oracle Java Release 17 de acordo com os "Termos e Condições Sem Taxa"</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><i><br /></i></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><i>Você recebe o direito de usar internamente os programas Oracle Java Release 17 não modificados para fins de desenvolvimento, teste, prototipagem e demonstração de seus aplicativos.</i></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Este direito já foi concedido anteriormente pela Oracle para versões anteriores do Oracle Java, bem como sob seu chamado “Contrato de Licença de Rede de Tecnologia Oracle para Oracle Java SE”. Fonte: <a href="https://www.oracle.com/downloads/licenses/javase-license1.html" target="_blank">https://www.oracle.com/downloads/licenses/javase-license1.html</a></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Um ponto importante a ter em mente é que ele afirma “seus aplicativos”. Isso é normalmente explicado pela Oracle (por exemplo, durante o curso de uma auditoria) como os aplicativos que você, como empresa, possui / desenvolveu. Em outras palavras, se você estiver usando o Oracle Java em um ambiente de "teste" ou "desenvolvimento" usado por um aplicativo de terceiros (um aplicativo que não seja "seu"), esse direito de uso não será concedido.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><i>Você recebe o direito de executar os programas Oracle Java Release 17 para seu uso pessoal ou operações comerciais internas.</i></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Este direito de fazer uso dos programas Oracle Java Release 17 para seu próprio “uso pessoal” já foi concedido anteriormente pela Oracle para versões anteriores do Oracle Java, bem como sob seu chamado “Contrato de Licença de Rede de Tecnologia Oracle para Oracle Java SE”. “Uso pessoal” refere-se ao uso individual dos programas Oracle Java apenas em um desktop ou laptop sob o controle de tal indivíduo. Em outras palavras, um laptop / desktop corporativo não está sob o controle de um indivíduo (mas está sob o controle de uma empresa) e, portanto, não é classificado como “uso pessoal”.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><i><br /></i></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><i>O direito de executar os programas Oracle Java Release 17 para suas "operações comerciais internas"</i></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Esse direito é NOVO! Isso significa que uma organização de usuário final tem o direito de implantar e usar os programas Oracle Java versão 17 para suas operações comerciais internas. Em outras palavras, se você deseja implantar e usar o Oracle Java versão 17 em sua organização, não precisa mais ter uma licença separada para o uso do Oracle Java versão 17. Mas lembre-se de que isso é aplicável SOMENTE, se sua implementação e o uso do Oracle Java ainda não é regido por outro Contrato de Licença Oracle (por exemplo, Oracle Master Agreement).</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b>Mas por quanto tempo a Oracle usará o NFTC e o que acontece depois?</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">A Oracle usará o NFTC para JDK 17 e versões posteriores. Os lançamentos LTS, como o JDK 17, receberão atualizações sob esta licença por um ano após o lançamento do LTS subsequente. Após o período de licença de uso gratuito, a Oracle pretende usar a Licença OTN, a mesma usada atualmente para as versões Java 8 e 11 LTS, para atualizações subsequentes.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Em outras palavras, como uma organização, você só pode usar o Oracle JDK 17 gratuitamente em produção até setembro de 24 (1 ano após o próximo LTS). Se sua empresa deseja mais atualizações do Java 17 após 24 de setembro, ela deve comprar a assinatura do Oracle Java SE e voltar ao contrato de licença OTN (ou pular para a próxima versão LTS a cada 2 anos).</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b style="font-size: 17.3333px;">Conclusão</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b style="font-size: 17.3333px;"><br /></b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><span style="font-size: 17.3333px;">Este é um tema </span></span></span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">complexo e</span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"> difícil de entender. Podem haver muitas interpretações das cláusulas de um contrato, ainda mais para uma pessoa leiga.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Se você ou a sua empresa não tem intensão de assinar um contrato com a Oracle, o recomendado é utilizar o projeto OpenJDK que é exatamente igual (O core e as Api's são as mesmas e o suficiente para rodar nossas aplicações) ao Oracle JDK. Ainda temos opções de outros projetos livres, tais como o AdoptOpenJDK que agora se chama </span><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><a href="https://adoptium.net/">https://adoptium.net/</a></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências (em inglês)
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="text-align: left;"><a href="https://medium.com/javarevisited/oracle-jdk-now-is-free-1ff0802fa5fb" target="_blank">https://medium.com/javarevisited/oracle-jdk-now-is-free-1ff0802fa5fb</a></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><a href="https://www.linkedin.com/pulse/oracle-java-release-17-now-free-again-richard-spithoven/" target="_blank">https://www.linkedin.com/pulse/oracle-java-release-17-now-free-again-richard-spithoven/</a></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p></span><p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 18pt; margin-right: 18pt; margin-top: 0pt;"><a href="https://twitter.com/sandrogiacom" style="background-color: transparent;" target="_blank"><img alt="" src="https://thepracticaldev.s3.amazonaws.com/i/gmrz82bjwhej1f1iqb1e.png" /></a></p><p><br /></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-18635882900117611172021-09-18T19:40:00.004-03:002021-09-25T18:46:44.694-03:00Java 17<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Java 17" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="A tão esperada versão LTS depois do Java 11 acabou de ser liberada..." name="twitter:description"></meta>
<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWqcuZp6ZQWgyuDm1kRo4H-KPMlqZrZMRN6ff6XzZhJh43qMF8v838FMcMxlDqz1sJDdaFqReuFiAG2HzSkQTa2ujPS5gVJP1irWDtYgT8H3V1Zl5ES1EOIVhkkpA7hEkEDAIepveoan2g/w640-h329/java-17.png" name="twitter:image"></meta>
<p> <span style="text-align: center;"> </span></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWqcuZp6ZQWgyuDm1kRo4H-KPMlqZrZMRN6ff6XzZhJh43qMF8v838FMcMxlDqz1sJDdaFqReuFiAG2HzSkQTa2ujPS5gVJP1irWDtYgT8H3V1Zl5ES1EOIVhkkpA7hEkEDAIepveoan2g/s1280/java-17.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="658" data-original-width="1280" height="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWqcuZp6ZQWgyuDm1kRo4H-KPMlqZrZMRN6ff6XzZhJh43qMF8v838FMcMxlDqz1sJDdaFqReuFiAG2HzSkQTa2ujPS5gVJP1irWDtYgT8H3V1Zl5ES1EOIVhkkpA7hEkEDAIepveoan2g/w640-h329/java-17.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div><p></p><span id="docs-internal-guid-faac5b92-7fff-cf2d-5d61-2ec47117d3d1"><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java 17</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">A tão esperada versão LTS depois do Java 11 acabou de ser liberada. E sabe porque não houve tanto barulho na comunidade? Porque esta versão já vem sendo experimentada desde a própria versão 11.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Nova Cadência</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Este é o oitavo lançamento de recurso entregue no prazo ao longo da cadência de lançamento de seis meses. Esse nível de previsibilidade permite que os desenvolvedores gerenciem facilmente sua adoção de inovação, graças a um fluxo constante de mudanças esperadas.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Abaixo uma tabela com as releases e as funcionalidades liberadas em cada uma delas. Graças a esta cadência, não precisamos esperar por anos para experimentar e usar uma nova funcionalidade.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="background-color: white; line-height: 1.656; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-492855e4-7fff-2e16-a295-7065cb71a12d"></span></span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none; table-layout: fixed; width: 451.276pt;"><colgroup><col></col><col></col></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">Versão</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">Funcionalidades</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><a href="https://openjdk.java.net/projects/jdk/11/" target="_blank">JDK 11 (LTS) - Set 2018</a></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">17</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><a href="https://openjdk.java.net/projects/jdk/12/" target="_blank">JDK 12 - Mar 2019</a></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">8</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><a href="https://openjdk.java.net/projects/jdk/13/" target="_blank">JDK 13 - Set 2019</a></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">5</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><a href="https://openjdk.java.net/projects/jdk/14/" target="_blank">JDK 14 - Mar 2020</a></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">16</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><a href="https://openjdk.java.net/projects/jdk/15/" target="_blank">JDK 15 - Set 2020</a></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">14</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><a href="https://openjdk.java.net/projects/jdk/16/" target="_blank">JDK 16 - Mar 2021</a></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">17</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><a href="https://openjdk.java.net/projects/jdk/17/" target="_blank">JDK 17 (LTS) - Set 2021</a></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">14</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java 17 é a segunda com suporte de longo prazo (LTS) sob a cadência de lançamento anunciada em 2018. A Oracle anunciou planos para encurtar o tempo entre lançamentos de LTS futuros, de 3 anos para 2 anos, então você deve esperar que o próximo LTS seja Java 21 em setembro de 2023.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><b style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Opções de download</b></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Como a Oracle é a principal mantenedora do projeto OpenJDK é normal que nos primeiros dias após o lançamento somente seja possível fazer o download através do site do <a href="https://jdk.java.net/17/" target="_blank">próprio projeto</a> ou pelo site da <a href="https://www.oracle.com/java/technologies/downloads/" target="_blank">Oracle</a></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b>UPDATE</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Link para download do projeto AdoptOpenJDK</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><a href="https://adoptium.net/releases.html?variant=openjdk17" target="_blank">https://adoptium.net/releases.html?variant=openjdk17</a></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><b><br /></b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><b>1. Listagem de Features</b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><a href="https://openjdk.java.net/jeps/409" rel="nofollow noopener" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #0a66c2; font-family: "Source Serif Pro", serif; font-size: 20px; margin: 0px; max-width: 1128px; overflow-wrap: break-word; padding: 0px; text-align: start; vertical-align: baseline; white-space: normal; width: 100%;" target="_blank"><span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; vertical-align: baseline; width: 100%;">JEP 409</span></a><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; white-space: normal; width: 100%;">: Sealed Classes</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; white-space: normal; width: 100%;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Classes seladas permitem que designers de API especifiquem quais classes ou interfaces podem estender ou implementar uma determinada classe. Ter uma lista exaustiva de casos a serem considerados ao modelar um problema pode simplificar o desenvolvimento. O JEP 409 foi desenvolvido no <a href="https://openjdk.java.net/projects/amber/" target="_blank">OpenJDK Project Amber</a>, que visa melhorar continuamente a produtividade do desenvolvedor por meio da evolução da linguagem de programação Java.</span></span></p><pre style="background-color: white; color: #080808; font-family: "JetBrains Mono", monospace; font-size: 13.5pt;"><span style="color: #0033b3;">public sealed class </span><span style="color: black;">Animal </span><span style="color: #0033b3;">permits </span><span style="color: black;">Dog</span>, <span style="color: black;">Cat </span>{<br />}<br /></pre><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">O código acima indica que somente as classes Dog e Cat podem extender a classe Animal. Qualquer tentativa de extender animal em outra classe, causará um erro de compilação.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b>2. Atualizações e melhorias nas bibliotecas principais</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b><br /></b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><a href="https://openjdk.java.net/jeps/306" rel="nofollow noopener" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #0a66c2; font-family: "Source Serif Pro", serif; font-size: 20px; margin: 0px; max-width: 1128px; overflow-wrap: break-word; padding: 0px; text-align: start; text-decoration-line: none; vertical-align: baseline; width: 100%;" target="_blank"><span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; vertical-align: baseline; width: 100%;">JEP 306</span></a><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; width: 100%;">: Restore Always-Strict Floating-Point Semantics</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">A linguagem de programação Java e a máquina virtual Java originalmente tinham apenas uma semântica de ponto flutuante estrita. A partir do JDK 1.2, pequenas variações nessas semânticas estritas foram permitidas por padrão para acomodar as limitações das arquiteturas de hardware atuais. Essas variações não são mais úteis ou necessárias e foram removidas pelo JEP 306.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><a href="https://openjdk.java.net/jeps/356" rel="nofollow noopener" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #0a66c2; font-family: "Source Serif Pro", serif; font-size: 20px; margin: 0px; max-width: 1128px; overflow-wrap: break-word; padding: 0px; text-align: start; text-decoration-line: none; vertical-align: baseline; width: 100%;" target="_blank"><span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; vertical-align: baseline; width: 100%;">JEP 356</span></a><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; width: 100%;">: Enhanced Pseudo-Random Number Generator</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">As atualizações de java.util.random melhoram a interoperabilidade de diferentes PRNGs (geradores de números pseudo-aleatórios) e tornam mais fácil solicitar um algoritmo baseado em requisitos, em vez de codificar uma implementação específica. As alterações incluem novos tipos de interface e implementações para geradores de números pseudo-aleatórios (PRNGs), incluindo PRNGs puláveis e uma classe adicional de algoritmos PRNG separáveis (LXM) e uma nova classe RandomGeneratorFactory.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><a href="https://openjdk.java.net/jeps/382" rel="nofollow noopener" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #0a66c2; font-family: "Source Serif Pro", serif; font-size: 20px; margin: 0px; max-width: 1128px; overflow-wrap: break-word; padding: 0px; text-align: start; text-decoration-line: none; vertical-align: baseline; width: 100%;" target="_blank"><span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; vertical-align: baseline; width: 100%;">JEP 382</span></a><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; width: 100%;">: New macOS Rendering Pipeline</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; width: 100%;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">Este novo pipeline reduz a dependência do JDK na API Apple OpenGL obsoleta, implementando um pipeline de renderização Java 2D para macOS usando a nova API Apple Metal.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><a href="https://openjdk.java.net/jeps/415" rel="nofollow noopener" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #0a66c2; font-family: "Source Serif Pro", serif; font-size: 20px; margin: 0px; max-width: 1128px; overflow-wrap: break-word; padding: 0px; text-align: start; text-decoration-line: none; vertical-align: baseline; width: 100%;" target="_blank"><span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; vertical-align: baseline; width: 100%;">JEP 415</span></a><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; width: 100%;">: Context-Specific Deserialization Filters</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; width: 100%;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;">O Filtro de Dados de Serialização de Entrada, adicionado com JDK 9 (<a href="https://openjdk.java.net/jeps/290" target="_blank">JEP 290</a>), foi aprimorado permitindo que os aplicativos configurem filtros de desserialização específicos do contexto e selecionados dinamicamente por meio de uma fábrica de filtros em toda a JVM que é chamada para selecionar um filtro para cada operação de desserialização individual. Isso torna possível tirar proveito dos filtros de desserialização sem exigir que cada criador de stream atualize seu código ou tornar o filtro muito restritivo ou permissivo.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; width: 100%;">3. New Platform Support</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.75)" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: 700; margin: 0px; max-width: 1128px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline; width: 100%;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><b><a href="https://openjdk.java.net/jeps/391" rel="nofollow noopener" style="background-color: white; border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-align: start; text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 391</span></a><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;">: macOS AArch 64 Port</span></b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Oferece uma versão do JDK para macOS que roda nativamente nos sistemas mais recentes da Apple baseados em Arm 64.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;"><b>4. Previews and Incubators</b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;"><b><a href="https://openjdk.java.net/jeps/406" rel="nofollow noopener" style="border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 406</span></a><span style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">: Pattern Matching for switch (Preview)</span></b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;"><span style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Aprimora a linguagem de programação Java, permitindo que "</span><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">pattern matching</span></span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">" seja testada em uma instrução switch ou expressão switch. O uso de "</span><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">pattern matching</span></span><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">" em consultas complexas orientadas a dados do switch pode ser expresso de forma concisa e segura. Esta JEP está sendo desenvolvida no <a href="https://openjdk.java.net/projects/amber/" target="_blank">Projeto Amber</a>.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><b><a href="https://openjdk.java.net/jeps/412" rel="nofollow noopener" style="background-color: white; border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-align: start; text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 412</span></a><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;">: Foreign Function and Memory API (Incubator)</span></b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: normal;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;">Aprimora as APIs introduzidas com JDK 14 e JDK 15 por meio das quais programas Java podem interoperar com código e dados fora do Java runtime. Invocando com eficiência funções externas (ou seja, código fora da JVM) e acessando com segurança a memória externa (ou seja, memória não gerenciada pela JVM), a API permite que programas Java chamem bibliotecas nativas e processem dados nativos sem a fragilidade e o perigo de JNI. O JEP 412 foi desenvolvido no <a href="https://openjdk.java.net/projects/panama/" target="_blank">Projecto Panama</a>, que visa simplificar a interação entre o código Java e APIs externas (não Java).</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><b><a href="https://openjdk.java.net/jeps/414" rel="nofollow noopener" style="background-color: white; border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-align: start; text-decoration-line: none; touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 414</span></a><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">: Vector API (Second Incubator)</span></b></p><div><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">Aprimora APIs que permitem expressar cálculos de vetor de uma maneira que compilará de forma confiável em tempo de execução para obter instruções de vetor ideais em arquiteturas de CPU suportadas. As operações de vetor podem oferecer desempenho superior a cálculos escalares equivalentes e são bastante comuns em áreas como Aprendizado de Máquina, Inteligência Artificial e Criptografia.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>5. Future Proofing Java Programs</b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b><a href="https://openjdk.java.net/jeps/403" rel="nofollow noopener" style="border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration-line: none; touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 403</span></a><span style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">: Strongly Encapsulate JDK Internals</span></b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">Não será mais possível relaxar o encapsulamento forte de elementos internos por meio de uma única opção de linha de comando, como era possível no JDK 9 até o JDK 16. Essa alteração oculta por padrão, exceto algumas APIs internas críticas, como sun.misc.Unsafe. Ainda será possível acessar APIs internas existentes, mas isso agora exigirá enumerar, como parâmetros de linha de comando ou atributos de manifesto de arquivo JAR, cada pacote no qual o encapsulamento deve ser relaxado. A mudança levará a aplicativos mais seguros e menos dependências de implementações internas não padrão.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>6. Deprecations and Removals</b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><b><a href="https://openjdk.java.net/jeps/411" rel="nofollow noopener" style="background-color: white; border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-align: start; text-decoration-line: none; touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 411</span></a><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">: Deprecate the Security Manager for Removal</span></b></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">O Security Manager ainda é do Java 1.0. Não foi o principal meio de proteger o código Java do lado do cliente por muitos anos e raramente foi usado para proteger o código do lado do servidor.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><b><a href="https://openjdk.java.net/jeps/398" rel="nofollow noopener" style="background-color: white; border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-align: start; text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 398</span></a><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">: Deprecate the Applet API for Removal</span></b></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><b><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></b></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">A API Applet tornou-se essencialmente irrelevante, uma vez que todos os fornecedores de navegadores web removeram o suporte para plug-ins de navegador Java ou anunciaram planos para fazê-lo. A API Applet foi descontinuada anteriormente (embora não para remoção) no Java 9 (JEP 289) em setembro de 2017.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><b><a href="https://openjdk.java.net/jeps/407" rel="nofollow noopener" style="background-color: white; border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-align: start; text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 407</span></a><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">: Remove RMI Activation</span></b></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">O mecanismo de ativação do Remote Method Invocation (RMI) foi removido. Esta mudança não afeta o resto do RMI. O mecanismo de ativação RMI foi descontinuado para remoção no JDK 15 em setembro de 2020.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>7. For OpenJDK Contributors</b></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><b><a href="https://openjdk.java.net/jeps/410" rel="nofollow noopener" style="background-color: white; border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-align: start; text-decoration-line: none; touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" target="_blank"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">JEP 410</span></a><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">: Remove the Experimental AOT and JIT Compiler</span></b></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span color="rgba(0, 0, 0, 0.9)" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-family: "Source Serif Pro", serif; font-size: 20px; font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); text-align: start; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 17.3333px; text-align: left; white-space: pre-wrap;"><span style="font-family: Arial;">O compilador experimental baseado em Java (AOT) e just-in-time (JIT) teve pouco uso desde sua introdução no JDK 9, surgiram alternativas mais amplamente suportadas e o esforço necessário para mantê-las é significativo. Como componentes opcionais, eles já foram removidos do JDK 16. Este JEP remove o código-fonte do projeto OpenJDK.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 17.3333px; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Artigo original (em inglês)
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b><u><a href="https://www.linkedin.com/pulse/arrival-java-17-sharat-chander/" target="_blank">https://www.linkedin.com/pulse/arrival-java-17-sharat-chander/</a></u></b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial;"><span style="font-size: 17.3333px; white-space: pre-wrap;"><b><u><br /></u></b></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p></span><p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 18pt; margin-right: 18pt; margin-top: 0pt;"><a href="https://twitter.com/sandrogiacom" style="background-color: transparent;" target="_blank"><img alt="" src="https://thepracticaldev.s3.amazonaws.com/i/gmrz82bjwhej1f1iqb1e.png" /></a></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-30028354306751846252021-04-17T19:27:00.005-03:002021-04-17T19:30:45.014-03:00Java 16 - Pattern Matching for instanceof<meta content="summary_large_image" name="twitter:card"></meta>
<meta content="Java 16 - Pattern Matching for instanceof" name="twitter:title"></meta>
<meta content="@sandrogiacom" name="twitter:site"></meta>
<meta content="O objetivo é deixar o instanceof mais simples e seguro uma vez que o “cast” é feito em tempo de compilação. Mas não é apenas isso..." name="twitter:description"></meta>
<meta content="https://lh4.googleusercontent.com/147dO9QV8sVFtQ4dwrCw41w5sejKFwtnQt8bjl2jbpZR7EcSpSm1iklQlU8QvTdaam1Rkg80mK7fQfO3FfleDrza2ZPEJ2TrXBKa_rUGWrC2ijR2T3PYwln-_xIvHddozaKE_6Ni=w400-h266" name="twitter:image"></meta>
<p style="text-align: center;"> <img height="426" src="https://lh4.googleusercontent.com/147dO9QV8sVFtQ4dwrCw41w5sejKFwtnQt8bjl2jbpZR7EcSpSm1iklQlU8QvTdaam1Rkg80mK7fQfO3FfleDrza2ZPEJ2TrXBKa_rUGWrC2ijR2T3PYwln-_xIvHddozaKE_6Ni=w640-h426" style="font-family: Arial; font-size: 11pt; margin-left: 0px; margin-top: 0px; text-align: center; white-space: pre-wrap;" width="640" /></p><span id="docs-internal-guid-faac5b92-7fff-cf2d-5d61-2ec47117d3d1"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Java 16 - Pattern Matching for instanceof</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Este é mais um recurso introduzido no </span><a href="https://openjdk.java.net/jeps/305" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Java 14</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> como preview e continuou assim até ser liberado definitivamente no </span><a href="https://openjdk.java.net/jeps/394" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Java 16</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">O objetivo é deixar o </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">instanceof</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> mais simples e seguro uma vez que o “</span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">cast”</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> é feito em tempo de compilação. Mas não é apenas isso...
</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">public</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">class</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Animal</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">public</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">void</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #0048ab; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">dizerOla</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">(Animal animal) {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">if</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (animal </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">instanceof</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Cao cao) {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> cao.latir();</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> } </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">else</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">if</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (animal </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">instanceof</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Gato gato) {</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> gato.miar();</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> }</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> }</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">}</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
Ainda podemos utilizar expressões mais complexas para validar a instância
</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">} </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">else</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">if</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (animal </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">instanceof</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Gato gato && gato.getIdade() > 5) {</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
Neste caso, podemos ter algumas restrições quanto às expressões após o </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">instanceof</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. Por exemplo, não podemos utilizar a expressão ||. A explicação para isso é que por causa da semântica do operador ||, a variável padrão </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">gato</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> pode não ter sido atribuída e, portanto, a análise de fluxo determina que a variável </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">gato</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> não está no escopo no lado direito do operador ||.
</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #eaeef3; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">} </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">else</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">if</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (animal </span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">instanceof</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Gato gato || </span><span face="Consolas, sans-serif" style="color: red; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">gato</span><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.getIdade() > 5) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="color: #00193a; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="color: red; font-size: 13.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">>> Cannot resolve symbol 'gato'</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
O código acima não compila, pois não se pode ter certeza que a variável </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">gato</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> será atribuída.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Conclusão
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Esta mudança não é simplesmente para deixar o </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">instanceof</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> mais simples e sim permitir que os </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">records</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, expressões </span><span style="font-family: Arial; font-size: 13pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">switch</span><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> e futuramente padrões de desconstrução tão fácil como construir um objeto.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Referências
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><a href="https://openjdk.java.net/jeps/394" style="text-decoration-line: none;" target="_blank">https://openjdk.java.net/jeps/394</a></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><a href="https://www.infoq.com/articles/java-pattern-matching/" style="text-decoration-line: none;" target="_blank">https://www.infoq.com/articles/java-pattern-matching/</a></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p></span>
<p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 18pt; margin-right: 18pt; margin-top: 0pt;"><a href="https://twitter.com/sandrogiacom" style="background-color: transparent;" target="_blank"><img alt="" src="https://thepracticaldev.s3.amazonaws.com/i/gmrz82bjwhej1f1iqb1e.png" /></a></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0tag:blogger.com,1999:blog-6448280182389226496.post-87433827092157664212021-04-06T17:23:00.003-03:002021-04-06T17:33:12.525-03:00Microsoft anuncia sua distribuição Java<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Microsoft anuncia sua distribuição Java">
<meta name="twitter:site" content="@sandrogiacom">
<meta name="twitter:image" content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim6TkDQ123v31hTvNUAt66R4D8f3VneQokq2P8KAnbhIyiJ_fcvhA8h4946H4wOFcYpADLwbor3tOf4rnBSQADTikmXS7LD-2My1QNZSKV7TIilx3MHm6f4ZL1cAflTkSNG3s3PTWtEmWP/w640-h460/microsoft-loves-java.png">
<p><span style="font-family: Arial; font-size: 26pt; white-space: pre-wrap;"></span></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><span style="font-family: Arial; font-size: 26pt; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim6TkDQ123v31hTvNUAt66R4D8f3VneQokq2P8KAnbhIyiJ_fcvhA8h4946H4wOFcYpADLwbor3tOf4rnBSQADTikmXS7LD-2My1QNZSKV7TIilx3MHm6f4ZL1cAflTkSNG3s3PTWtEmWP/s926/microsoft-loves-java.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="666" data-original-width="926" height="460" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim6TkDQ123v31hTvNUAt66R4D8f3VneQokq2P8KAnbhIyiJ_fcvhA8h4946H4wOFcYpADLwbor3tOf4rnBSQADTikmXS7LD-2My1QNZSKV7TIilx3MHm6f4ZL1cAflTkSNG3s3PTWtEmWP/w640-h460/microsoft-loves-java.png" width="640" /></a></span></div><div class="separator" style="clear: both; text-align: center;"><span style="font-family: Arial; font-size: 26pt; text-align: left; white-space: pre-wrap;"><div style="text-align: left;"><span style="font-size: 26pt;">Microsoft anuncia sua distribuição Java</span></div></span></div></div><p></p><span id="docs-internal-guid-4f2589c1-7fff-cca3-ca68-006c75d54688"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A Microsoft anunciou neste dia a sua distribuição Java baseada no OpenJDK 11. O texto a seguir é uma tradução adaptada do post original do </span><a href="https://twitter.com/brunoborges" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">@brunoborges</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> que pode ser lido </span><a href="https://devblogs.microsoft.com/java/announcing-preview-of-microsoft-build-of-openjdk/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">aqui</span></a><span style="font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 12pt; text-align: justify;"><span style="background-color: transparent; color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">“Hoje temos o prazer de anunciar a prévia do Build do OpenJDK da Microsoft, uma nova distribuição gratuita de Long-Term Support (LTS) do OpenJDK que é de código aberto e está disponível gratuitamente para qualquer pessoa implantar em qualquer lugar. Inclui binários para Java 11, baseado em OpenJDK 11.0.10 + 9, em servidores x64 e ambientes de desktop em macOS, Linux e Windows. Também estamos publicando um novo binário de acesso antecipado para Java 16 para Windows em ARM, baseado na versão mais recente do OpenJDK 16 + 36.”</span></p><p dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 12pt; text-align: justify;"><span style="color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Visite </span><a href="https://www.microsoft.com/openjdk" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">microsoft.com/openjdk</span></a><span style="color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> para baixar pacotes e instaladores.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">“Os binários do </span><span style="color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Build do OpenJDK da Microsoft</span><span style="background-color: white; color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> para Java 11 são baseados no </span><a href="https://github.com/openjdk" style="text-decoration-line: none;" target="_blank"><span style="background-color: white; color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">código-fonte OpenJDK</span></a><span style="background-color: white; color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> , seguindo os mesmos </span><a href="https://github.com/AdoptOpenJDK/openjdk-build" style="text-decoration-line: none;" target="_blank"><span style="background-color: white; color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">scripts de construção usados pelo projeto Eclipse Adoptium</span></a><span style="background-color: white; color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> e testados em relação ao </span><a href="https://github.com/AdoptOpenJDK/openjdk-tests" style="text-decoration-line: none;" target="_blank"><span style="background-color: white; color: #1155cc; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">pacote Eclipse Adoptium Quality Assurance</span></a><span style="background-color: white; color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (incluindo testes de projeto OpenJDK). Nossos binários para Java 11 foram aprovados no Java Technical Compatibility Kit (TCK) para Java 11, que é usado para verificar a compatibilidade com a especificação Java 11. O Microsoft Build de OpenJDK é um substituto simples para qualquer outra distribuição OpenJDK disponível no ecossistema Java.”
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; color: #333333; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">A Microsoft vem colaborando muito com o Java nas últimas releases e faz sentido que ela tenha sua própria distribuição assim como a Amazon e outras grandes empresas de cloud.
</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: white; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span style="color: #333333; font-family: Arial;"><span style="font-size: 13pt; white-space: pre-wrap;">Continuando ainda no artigo original: “No final deste ano, o Build do OpenJDK da Microsoft se tornará a distribuição padrão do Java 11 entre os serviços gerenciados pelo Azure. Os clientes não terão que realizar nenhuma tarefa de manutenção, pois a transição será suave e transparente por meio das implantações de aplicativos. Para todos os outros serviços do Azure, os clientes podem trazer o JDK de sua escolha, incluindo o Microsoft Build of OpenJDK. Forneceremos mais atualizações sobre isso nos próximos meses.”</span></span>
</span></p><div style="color: #333333; font-family: Arial; font-size: 13pt; text-align: justify; white-space: pre-wrap;"><span style="text-align: left;"> </span></div></span><p></p><p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 0pt; margin-right: 18pt; margin-top: 0pt; padding: 0pt 0pt 18pt;"><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">E aí, o que achou desta novidade? Deixe nos comentários se já testou ou irá testar esta nova distribuição. Lembrando que ainda é uma versão prévia. Um abraço e até a próxima!
</span><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">
<b>Referências</b></span><span style="background-color: transparent; font-family: Arial; font-size: 13pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">:
</span><a href="https://devblogs.microsoft.com/java/announcing-preview-of-microsoft-build-of-openjdk/" style="background-color: transparent; font-family: Arial; font-size: 13pt; text-decoration-line: none; white-space: pre-wrap;" target="_blank">https://devblogs.microsoft.com/java/announcing-preview-of-microsoft-build-of-openjdk/</a></p>
<p dir="ltr" style="background-color: white; line-height: 1.8; margin-bottom: 18pt; margin-right: 18pt; margin-top: 0pt;"><a href="https://twitter.com/sandrogiacom" style="background-color: transparent;" target="_blank"><img alt="" src="https://thepracticaldev.s3.amazonaws.com/i/gmrz82bjwhej1f1iqb1e.png" /></a></p><div class="blogger-post-footer">Assine o feed de postagens</div>Sandro Giacomozzihttp://www.blogger.com/profile/05187741172180363171noreply@blogger.com0