Como funciona a classe String em Java
Fonte:
DZone Recentemente me deparei com a seguinte pergunta em um fórum: “Quantos objetos
String são criados aqui ? Um ou dois?".
String langName = new String("Java");
Fiquei curioso para saber como os outros responderam, sabendo que é uma questão complexa, principalmente se não se tem muito conhecimento de como funciona a classe
String em Java. E então, mergulhei na seção de comentários.
Para minha surpresa, entre os comentadores houve pessoas que escolheram “Um” como resposta correta, mas muito mais pessoas responderam “Dois”. Por um segundo, comecei a duvidar do meu conhecimento sobre
Strings . A resposta correta é que tudo depende das circunstâncias. A questão não é suficientemente clara e deixa espaço para debate. Eu reformularia assim:
1. Quantos objetos Java String são criados na memória quando esta instrução é executada?
Existe apenas uma resposta.
Quantos objetos Java String permanecerão na memória após a execução desta instrução?
A resposta é dois. Espero que a incerteza tenha desaparecido assim que verifiquei o despejo de memória do programa com uma declaração como o exemplo acima.
O despejo de memória do programa na imagem acima mostra a existência de dois objetos
String com o mesmo conteúdo. Isso prova que chamar o construtor da classe
String e passar uma string literal como argumento resulta na adição de dois objetos ao heap de memória: um na memória regular (não-pool) e outro no String Constant Pool (SCP), um área na memória que também faz parte do heap. As dificuldades começam após a adição. Chamar o construtor sempre resulta na colocação de um novo objeto em uma área que não seja do pool. Mas o argumento do construtor, que é uma string literal, também é um objeto e é criado e armazenado no SCP durante o carregamento da classe, desde que o conjunto de strings não contenha strings com o mesmo conteúdo. A
Especificação da Linguagem Java afirma que “literais de string — ou, mais geralmente, Strings que são os valores de expressões constantes (§15.28) — são “internados” para compartilhar instâncias únicas usando o método
String . Como uma string em Java é literal e, portanto, representa o valor de uma expressão constante, ela é agrupada. Para tornar isso ainda mais óbvio, vamos reescrever o código apresentado no início do artigo da seguinte forma:
String java = "Java";
String langName = new String(java);
Agora vamos voltar à questão principal. A instrução a seguir criará um ou dois objetos
String :
String langName = new String("Java");
Para responder a essa pergunta e tirar qualquer suspeita, vejamos o bytecode do método principal:
public static main([Ljava/lang/String;)V
L0
LINENUMBER 11 L0
NEW java/lang/String
DUP
LDC "Java"
INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V
ASTORE 1
L1
LINENUMBER 14 L1
FRAME APPEND [java/lang/String]
GOTO L1
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
LOCALVARIABLE langName Ljava/lang/String; L1 L2 1
MAXSTACK = 3
MAXLOCALS = 2
Na linha 6 você pode ver o comando LDC (Load Constant). Ele carrega um elemento do conjunto de constantes de string na pilha. Isso significa que no momento em que o construtor é chamado, o literal Java, que também é um objeto, já foi adicionado ao pool. Isso aconteceu ao carregar uma classe. Assim, chamar o construtor da classe
String com uma string literal cria apenas um objeto e o coloca em um local de memória não agrupado.
Aprenda como implementar uma interface web em Java
Fonte:
Dev.to O mundo do JavaScript oferece frameworks web úteis e divertidos, não há dúvida disso. Existe uma alternativa interessante para desenvolvedores Java - a estrutura
Vaadin de código aberto . Com ele, você pode implementar facilmente
uma interface gráfica de usuário (GUI) para a web usando apenas a linguagem de programação Java e nada mais. Você não precisa escrever uma única linha de HTML ou JavaScript. Uma imagem vale mais que mil palavras:
Como Vaadin funciona?
À esquerda da captura de tela você vê uma classe Java. Este código é executado em um servidor como Apache Tomcat, Eclipse Jetty ou qualquer outro contêiner de servlet. Você pode usar a API fornecida pela plataforma para criar
componentes de interface do usuário (UI) , como campos de texto, caixas de combinação, grades de dados, seletores de data, campos de upload e muitos outros. Você pode combinar esses componentes para criar uma visualização (também conhecida como página ou UI), usando layouts para organizar os componentes da interface do usuário (UI) verticalmente, horizontalmente ou de qualquer outra forma usando CSS. No exemplo anterior, criamos
um TextField e
um Button adicionando-os ao
VerticalLayout . Quando a visualização estiver pronta, você poderá abri-la por meio de uma URL usando a anotação
@Route . Neste exemplo, disponibilizamos em http://localhost:8080/hello usando
@Route("hello") . O aplicativo Vaadin é um aplicativo da web em Java. A estrutura fornece uma implementação de Servlet (
VaadinServlet ) que lida com solicitações e respostas HTTP para você. Este servlet verifica classes Java marcadas com a anotação
@Route para exibir a visualização correta no navegador. Quando um aplicativo Vaadin é solicitado pela primeira vez, Vaadin responde com um arquivo JavaScript leve que serve como mecanismo cliente. Este mecanismo se encarrega de processar eventos no navegador e enviá-los ao servidor como mensagens JSON. O objeto
VaadinServlet processa solicitações e retorna respostas JSON de forma semelhante ao mecanismo do lado do cliente. O mecanismo então usa essa mensagem para atualizar os elementos da página que precisam ser atualizados, se houver. Vaadin usa uma sessão HTTP para armazenar uma árvore de componentes que contém o estado da interface do usuário. Coisas como componentes formam a representação e seus estados (ativado/desativado, legenda, valor, etc.). Tudo isso proporciona um nível de segurança que vale a pena mencionar. Como a lógica da interface do usuário está no servidor, ela não está acessível aos invasores. As verificações são realizadas no servidor. Por exemplo, se um botão for desabilitado usando
setEnabled(false) , então este não é apenas um recurso cosmético no navegador - o servidor não executará nenhuma lógica nos ouvintes de clique adicionados ao botão desabilitado, evitando que invasores explorem ferramentas de desenvolvedor no navegador para alterar o estado habilitado ou chame
VaadinServlet para simular um clique do mouse (evento de clique).
O uso do Vaadin é gratuito?
Sim. Vaadin é uma estrutura de código aberto publicada sob a licença Apache 2.0. Você não precisa comprar nada para criar aplicativos da web completos com ele. Existem componentes comerciais que melhoram o desempenho, mas não são obrigatórios. Por exemplo, existe
um designer visual e um componente CRUD para ajudá-lo a criar visualizações ainda mais rapidamente. Você pode experimentar esses componentes gratuitamente antes de assinar.
Vaadin é um substituto para JSP e JSF?
Sim. Ele pode ser usado como um substituto para estruturas JSP, JSF e até mesmo JavaScript como Angular. Muitos clientes Vaadin migraram com sucesso dessas tecnologias para Vaadin.
Vaadin tem suporte para Spring e Jakarta EE?
Sim. Vaadin tem integração oficial com Spring e Jakarta EE (anteriormente Java EE). Você pode adicionar Vaadin como uma dependência ao criar um novo projeto Spring Boot usando Spring Initializr. Para Jakarta EE, você pode baixar um exemplo simples de Hello, World que usa Jakarta EE. No momento em que este artigo foi escrito, apenas o Jakarta EE versão 8 era compatível.
Quem usa Vaadin?
Muitas empresas da Fortune 500 usam Vaadin, bem como startups de sucesso e mais de 200 mil desenvolvedores em todo o mundo. Confira o
Guia de início rápido e outras
documentações do Vaadin .
GO TO FULL VERSION