Estreia no Java uma nova interessante ferramenta de linha de
comando denominada jshell, o console Java. Por meio dela é possível avaliar
expressões, efetuar declarações e executar diretivas do Java, sem a necessidade de construir um
projeto, um programa ou mesmo um método para seu teste.
Este post é parte da série Java 9::Primeiras Impressões, que comenta as principais características da nova versão do Java.
REPL
A abreviatura REPL significa Read-Evaluate-Print-Loop, uma
referência a consoles web e plug-ins de diversas linguagens, onde o usuário
fornece uma expressão ou diretiva da linguagem ao console (leitura), a qual é
processada imediatamente (avaliação), tendo seus resultados exibidos
(impressão), retornando à situação inicial (loop) onde uma outra expressão ou
diretiva pode ser interativamente fornecida.
Conforme as características próprias de cada um dos consoles
que existem, os resultados de avaliações anteriores podem ou não estar
disponíveis, possibilitando a acumulação de efeitos e o uso de tais ambientes
tanto para experimentação de coisas simples, como para simulação de construções
mais complexas, tudo de maneira bastante direta. Esta é a grande vantagem do
uso dos consoles REPL.
Como veremos, o jshell permite tanto executar expressões
simples, como definir variáveis, instanciar objetos e executar trechos
relativamente sofisticados de código, tornando-se igualmente apropriado para o
estudante e para o programador mais experiente.
Acionando o jshell
Em um prompt de comandos, console ou terminal, dependendo do
seu sistema operacional, garanta que o path está corretamente ajustado. No MS
Windows usualmente basta executar:
C:\Users\Jandl>path=C:\Program Files\Java\jdk-9\bin;%path%
No meu caso, o JDK da versão 9 está instalado em C:\Program
Files\Java\jdk-9\. O jshell, e as demais ferramentas de linha de comando do JDK
estão no subdiretório bin. Após o ajuste do path,
basta acionar o comando jshell, como mostra a figura que segue.
Experimente algo simples, como somar dois valores inteiros,
pressionando ENTER ao final:
Observe que a expressão “1 + 2” foi avaliada, de modo que o
resultado foi armazenado na variável temporária denominada $1, a qual foi
exibida. Fornecendo apenas o nome de tal variável, obteríamos o seu conteúdo.
Os ponto-e-vírgula, exigidos no código Java, podem ser omitidos,
visto que o jshell, frequentemente, é capaz de adicioná-los.
Testando diretivas e declarações
Diretivas simples, de repetição ou decisão, também podem ser
executadas, bastando digitar o código que se deseja avaliar, pressionado ENTER para seu processamento:
Se desejado, variáveis de qualquer tipo válido podem ser
declaradas:
O comando /vars
permite visualizar todas as variáveis válidas previamente definidas, assim como
seus tipos e conteúdos:
Eventualmente, o fragmento de código que se deseja testar
fica melhor organizado se escrito em várias linhas. Para isto basta digitar uma
linha e, com SHIFT+ENTER, continuar
na linha seguinte, como na figura abaixo:
Histórico de comandos: com as setas UP e DOWN do teclado é
possível navegar pelas lista de fragmentos anteriormente processados pelo
jshell. Após escolher o fragmento desejado, basta um ENTER para executá-lo.
Caso você deseje modificar um comando anterior, ou corrigir uma
linha com código errado, basta usar as setas UP e DOWN do teclado
para selecionar tal linha, usando as setas LEFT
e RIGHT, HOME e END para navegar
na linha. Se for um trecho de várias linhas, é necessário repetir todas as
linhas corretas, mais as corrigidas, na sequência desejada.
O comando /list
lista todos os fragmentos de código válido que foram avaliados.
Use o comando /<id>
para executar o fragmento identificado pelo id correspondente ou /! para repetir a execução do último
fragmento processado. Lembre-se apenas que os vários fragmentos utilizam as
variáveis definidas de maneira global, ou seja, todos os fragmentos têm acesso
à todas as variáveis, propagando seus efeitos por meio delas.
Características avançadas
Também é possível instanciar objetos, declarar e inicializar
arrays:
Como esperado, objetos de qualquer tipo, assim como arrays,
podem ser usados em fragmentos de código, como este que segue, que utiliza o
objeto StringBuilder e o array de String declarados acima:
Com o jshell é possível declarar-se métodos para uso
independente ou em outros fragmentos.
Até mesmo novos tipos (classes, interfaces ou enumerações)
podem ser definidos.
Desta maneira, objetos dos tipos existentes ou definidos no
ambiente jshell podem ser instanciados e utilizados.
Comandos do jshell
O jshell suporta a execução de vários comandos, todos
precedidos por /, que podem facilitar sua utilização. A tabela que segue mostra
os principais comandos em suas formas mais simples:
Comando
|
Efeito
|
/list
|
Lista os fragmentos válidos fornecidos.
|
/edit <id>
|
Edita o fragmento identificado por <id>.
|
/drop <id>
|
Remove o fragmento identificado por <id>.
|
/save <fileName>
|
Salva os fragmentos de código no arquivo indicado.
|
/open <fileName>
|
Abre o arquivo contendo fragmentos de código.
|
/vars
|
Lista as variáveis declaradas e seus valores.
|
/methods
|
Lista os métodos declarados e suas assinaturas.
|
/types
|
Lista os tipos declarados.
|
/history
|
Lista o histórico do código digitado.
|
/<id>
|
Executa o fragmento identificado por <id>.
|
/!
|
Reexecuta o último fragmento válido.
|
/help
|
Exibe informação sobre o jshell e seus comandos
|
/exit
|
Finaliza o jshell.
|
Considerações Finais
O jshell é, realmente, uma ótima ferramenta, pois alia a
simplicidade e conveniência de uso com muita flexibilidade. Como permite testar
declarações, diretivas e expressões, incluindo a definição de métodos
independentes e de tipos completos, é muito útil para que deseja estudar Java,
pois permite praticar a construção de código limitando-se ao essencial. Mesmo
programadores mais experientes podem se beneficiar do seu uso para simular e
testar fragmentos de código de maneira rápida.
É isso!
/exit
Para saber mais
- https://www.journaldev.com/13121/java-9-features-with-examples
- https://docs.oracle.com/javase/9/jshell/introduction-jshell.htm#JSHEL-GUID-630F27C8-1195-4989-9F6B-2C51D46F52C8
- https://imasters.com.br/desenvolvimento/introducao-ao-java-9-jshell/?trace=1519021197&source=single
- https://en.wikipedia.org/wiki/JShell
- https://stackify.com/java-9-jshell/