JEP 401: Value Objects (Preview) mesclado ao master do OpenJDK
O Project Valhalla, de longa duração no Java, alcançou seu primeiro grande marco no OpenJDK: os preview “value objects”, um novo tipo de classe sem identidade de objeto, projetado para trazer desempenho semelhante ao de structs enquanto preserva as fortes garantias de memória e concorrência do Java. Os comentadores veem isso como aproximadamente “metade” do Valhalla e a parte mais importante, permitindo melhor uso de generics e layouts de dados mais eficientes, ao mesmo tempo em que observam o trabalho restante em nulabilidade, generics especializados e tipos de valor tearable. A mudança também provoca reflexões mais amplas sobre a evolução cautelosa e retrocompatível do Java, seu foco em desempenho em comparação com C# e JavaScript, e a distância entre a linguagem moderna e seu ecossistema enterprise pesado.
Escopo do Project Valhalla e do JEP 401
- O JEP 401 (Value Objects, Preview) foi mesclado; é visto como a primeira e crucial metade do Project Valhalla (aproximadamente “~50%” da visão).
- O trabalho restante inclui generics especializados, APIs SIMD/vector, generics reificados e tipos não anuláveis.
- Muitos comentadores dizem que isso, por si só, já torna o Valhalla um sucesso, especialmente para desempenho.
Value Objects: Semântica e Desempenho
- Os value objects são descritos como “semelhantes a structs”: sem identidade, imutáveis, flattenable quando possível, com grandes benefícios de memória e cache.
- O design enfatiza “integrity by default”: semântica segura e garantias fortes, com opções de desempenho como opt-ins explícitos.
- Um enquadramento de design divide os dados em quatro categorias: objetos clássicos, objetos sem identidade, valores atômicos e valores “tearable” (“clássicos”).
Integer, Identidade e Strings
Integere wrappers semelhantes tornam-se value classes, perdendo identidade de objeto; muitos observam queIntegerjá se comporta de forma “value-like” devido ao pooling e ao hashCode.- Projetos que dependem da identidade de
Integertiveram anos de aviso; algumas ferramentas de nicho (por exemplo, runtimes de linguagem voltados para a JVM) podem ser impactadas. - Strings não podem se tornar tipos de valor totalmente indistinguíveis principalmente por compatibilidade retroativa e restrições técnicas em torno de arrays de suporte de tamanho variável; os ganhos, de todo modo, são vistos como limitados.
Atomicidade, Tearability e Limites de Tamanho
- A discussão gira em torno da atomicidade: classes de valor não devem “tear” a menos que sejam explicitamente marcadas como tearable.
- O modelo atual vincula o flattening de referências ao tamanho da palavra da máquina (por exemplo, 63 bits + bit de null); valores maiores podem existir, mas não podem ser flattenados da mesma forma.
- Alguns argumentam que outras plataformas (por exemplo, .NET, CPUs com atomics de 128 bits) mostram trade-offs diferentes; outros enfatizam que o modelo de memória e as garantias de segurança do Java determinam o design.
Compatibilidade Retroativa e Migração
- Há grande apreço pela estabilidade de longo prazo do Java: código antigo normalmente continua funcionando sem mudanças; alterações quebráveis são raras, bem sinalizadas e restritas.
- Exemplo: sincronizar em instâncias de
Integereventualmente vai quebrar quando elas se tornarem value objects. - A semântica de valor é no local de declaração, não no local de uso, para garantir que imutabilidade e segurança possam ser impostas pela própria classe.
Processo e Governança do OpenJDK
- O PR compacta milhares de commits em um só por meio de um bot; o histórico detalhado é preservado em ferramentas separadas, não no Git.
- Alguns não gostam do histórico do Git “destruído”; outros argumentam que o processo é intencional para evitar lock-in do GitHub e manter as ferramentas externas portáveis.
- O trabalho em Valhalla é relatado como sendo, de forma esmagadora, conduzido pela Oracle, com elogios à disciplina e à visão de longo prazo em comparação com a cultura típica de “ship early”.
Impacto no Ecossistema
- Espera-se uma melhora significativa de desempenho para Java e linguagens de JVM de nível mais alto, como Scala, especialmente onde hoje a abstração é custosa.
- Generics sobre tipos de valor e melhor especialização de layout são destacados como grandes ganhos futuros.
Linguagem Java, Cultura e Comparações
- Muitos expressam forte entusiasmo pelo Java moderno: records, lambdas, streams, virtual threads, structured concurrency e, agora, value objects.
- Vários argumentam que o Java evoluiu de forma mais limpa que o C# (visto por alguns como excessivamente complicado) e mantém um modelo mais simples (value vs reference + Valhalla).
- Uma crítica persistente é à “cultura enterprise”: frameworks verbosos (especialmente Spring), nomes de classes longos e bases de código enormes; outros respondem que isso é cultural, não inerente ao Java.
- Menções positivas a frameworks mais leves (por exemplo, Helidon, Quarkus) e a designs centrados em virtual threads.
- O Java é repetidamente contrastado com JavaScript: sintaxe de superfície semelhante, mas objetivos muito diferentes; o Java é visto como à frente em recursos como data/time moderno, switch expressions e agora value objects.
Ferramentas e CLI
- Alguns gostariam de uma CLI unificada mais “batteries-included”, à la Go, para build/test/format/lsp, em vez da fragmentação atual (Maven, Gradle, etc.).
- O Maven é apreciado pela estabilidade, mas seu XML e modelo de atualização são criticados; o Gradle é visto como poderoso, mas sensível a versões.