Java 9 - Explorando o REPL

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.