Java 9 - Explorando o REPL
1. Introdução
Este artigo é sobrejshell, um console interativoREPL (Read-Evaluate-Print-Loop) que vem junto com o JDK para a próxima versão do Java 9. Para aqueles que não estão familiarizados com o conceito, um REPL permite executar interativamente trechos de código arbitrários e avaliar seus resultados.
Um REPL pode ser útil para coisas como verificar rapidamente a viabilidade de uma ideia ou descobrir, por exemplo, uma string formatada paraString ouSimpleDateFormat.
2. Corrida
Para começar, precisamos executar o REPL, o que é feito invocando:
$JAVA_HOME/bin/jshell
Se uma mensagem mais detalhada do shell for desejada, um sinalizador-v pode ser usado:
$JAVA_HOME/bin/jshell -v
Quando estiver pronto, seremos recebidos por uma mensagem amigável e um prompt familiar ao estilo Unix, na parte inferior.
3. Definindo e invocando métodos
Os métodos podem ser adicionados digitando sua assinatura e corpo:
jshell> void helloWorld() { System.out.println("Hello world");}
| created method helloWorld()
Aqui definimos o onipresente método "olá mundo". Pode ser chamado usando a sintaxe Java normal:
jshell> helloWorld()
Hello world
4. Variáveis
As variáveis podem ser definidas com a sintaxe normal da declaração Java:
jshell> int i = 0;
i ==> 0
| created variable i : int
jshell> String company = "example"
company ==> "example"
| created variable company : String
jshell> Date date = new Date()
date ==> Sun Feb 26 06:30:16 EST 2017
| created variable date : Date
Observe que o ponto-e-vírgula é opcional. As variáveis também podem ser declaradas sem inicialização:
jshell> File file
file ==> null
| created variable file : File
5. Expressões
Qualquer expressão Java válida é aceita e o resultado da avaliação será mostrado. Se nenhum receptor explícito do resultado for fornecido, as variáveis "scratch" serão criadas:
jshell> String.format("%d of bottles of beer", 100)
$6 ==> "100 of bottles of beer"
| created scratch variable $6 : String
O REPL é bastante útil aqui, informando que ele criou uma variável de scratch chamada$6 cujo valor é “100 garrafas de cerveja na parede” e seu tipo éString.
Expressões de várias linhas também são possíveis. Jshell is smart enough to know when an expression is incomplete and will prompt the user to continue on a new line:
jshell> int i =
...> 5;
i ==> 5
| modified variable i : int
| update overwrote variable i : int
Observe como o prompt mudou para um…> indentado para significar a continuação de uma expressão.
6. Comandos
Jshell fornece alguns meta-comandos que não estão relacionados à avaliação de instruções Java. Todos eles começam com uma barra (/) para diferenciar das operações normais. Por exemplo, podemos solicitar uma lista de todos os comandos disponíveis emitindo/help ou /?
Vamos dar uma olhada em alguns deles.
6.1. Importações
Para listar todas as importações ativas na sessão atual, podemos usar o comando/import:
jshell> /import
| import java.io.*
| import java.math.*
| import java.net.*
| import java.nio.file.*
| import java.util.*
| import java.util.concurrent.*
| import java.util.function.*
| import java.util.prefs.*
| import java.util.regex.*
| import java.util.stream.*
Como podemos ver, o shell começa com algumas importações úteis já adicionadas.
6.2. Listas
Trabalhar em um REPL não é tão fácil quanto ter um IDE completo na ponta dos dedos: é fácil esquecer quais variáveis têm quais valores, quais métodos foram definidos e assim por diante. Para verificar o estado do shell, podemos usar/var,/methods,/list ou/history:
jshell> /var
| int i = 0
| String company = "example"
| Date date = Sun Feb 26 06:30:16 EST 2017
| File file = null
| String $6 = "100 of bottles of beer on the wall"
jshell> /methods
| void helloWorld()
jshell> /list
1 : void helloWorld() { System.out.println("Hello world");}
2 : int i = 0;
3 : String company = "example";
4 : Date date = new Date();
5 : File file;
6 : String.format("%d of bottles of beer on the wall", 100)
jshell> /history
void helloWorld() { System.out.println("Hello world");}
int i = 0;
String company = "example"
Date date = new Date()
File file
String.format("%d of bottles of beer on the wall", 100)
/var
/methods
/list
/history
A diferença entre/list e/history é que o último mostra comandos além de expressões.
6.3. Salvando
Para salvar o histórico da expressão, o comando/save pode ser usado:
jshell> /save repl.java
Isso salva nosso histórico de expressão emrepl.java no mesmo diretório a partir do qual executamos o comandojshell.
6.4. Carregando
Para carregar um arquivo salvo anteriormente, podemos usar o comando/open:
jshell> /open repl.java
Uma sessão carregada pode então ser verificada emitindo/var,/method ou/list.
6.5. Saindo
Quando terminarmos o trabalho, o comando/exit pode encerrar o shell:
jshell> /exit
| Goodbye
Adeusjshell.
7. Conclusão
Neste artigo, vimos o Java 9 REPL. Como o Java existe há mais de 20 anos, talvez tenha chegado um pouco tarde. No entanto, deve ser outra ferramenta valiosa em nossa caixa de ferramentas Java.