Concrete Logo
Hamburger button

Introdução ao Java 9 – Jshell

  • Blog
  • 16 de Outubro de 2017
Share

Seguindo nossa série sobre o Java 9 (se você não viu nada ainda, clica aqui), hoje vamos falar sobre uma funcionalidade bem interessante: o Jshell. É uma ferramenta semelhante às que já existem hoje no mercado em outras linguagens de programação, como Scala, JavaScript e outras. É um REPL (Read-Eval-Print Loop), ou seja, um terminal interativo que você pode utilizar para rodar código Java sem ter que ficar criando classes e métodos Main para executar seus experimentos e testes de maneira rápida.

Sem mais delongas, vamos ver na prática como o negócio funciona. Mas antes de começar a brincadeira, vamos baixar o JDK, ok?  Ele pode ser encontrado neste link.

Assim que a instalação for concluída, apenas verifique se a versão default do sistema seja o Java 9. Vamos lá:

Para iniciá-lo é bem simples: basta digitar jshell em um terminal.

Inicialmente, como o próprio Shell propõe, você pode acessar alguns exemplos de uso com o comando /help intro.

Ah! E o Jshell tem autocomplete. Quando você começar a escrever o nome de uma classe ou método, apertando a tecla TAB, o terminal vai te dar de cara algumas opções, caso exista mais de uma opção para completar sua sentença. No exemplo abaixo iniciei a escrita da classe String, mas como existem diversas outras classes e interfaces que iniciam com as mesmas letras, o Jshell logo trouxe várias sugestões:

Vamos brincar então… Quem já utilizou algum outro REPL com certeza vai ficar mais de boa nesses testes. E quem nunca utilizou vai acabar ficando viciado. =P

Declarar variáveis? Fácil: (tipo) + (nome_da_variavel) = (valor)(ou_ em_branco)

Note que ao atribuir um valor para variável ‘x’ o shell nos mostra o valor dela logo em seguida. Caso queira confirmar basta digitar ‘x’:

OBS: ponto e vírgula no final das sentenças é opcional, ok?

Então vamos mais adiante… Lembra do famoso Hello World? Quem nunca, né? Como fazíamos mesmo? Por ex.: em uma IDE, criávamos um projeto, uma classe (Main.java ou Teste.java) e então o famoso método Main (public static void main(String[] args)). APENAS para “printar” “Hello World” no terminal, não é? 😉 

Pois bem, vamos printar Hello Java 9 agora no Jshell? Se segura.

Brincadeira… Claro que para quem está iniciando faz o maior sentido trabalhar com uma IDE, saber criar uma classe e saber o que o método main faz, assim como sua estrutura. O Jshell, na minha opinião, foi feito tanto para a didática do ensino Java, como para desenvolvedores mais experientes testarem alguns códigos ou APIs de forma mais prática e rápida.

Podemos também criar variáveis de forma implícita, sem precisar dar um tipo ou um nome para ela.

Note que automagicamente o Jshell criou uma variável com o nome $5. Para as variáveis implícitas, o shell sempre atribui um “nome” começando com $ (dollar) e em seguida um ID chamado de snippet, nome que o Jshell dá para os comandos que você executa. Eles vão ficando armazenados na instância do shell e para visualizar basta digitar /list;

Viram? Até agora esses foram os comandos que digitamos. A cada comando uma chave (key ou snippet) é atribuída para o comando. O Jshell faz a identificação e a “tipagem” do objeto por trás dos panos. Desta forma, podemos usar métodos desse tipo que foi fixado. Por ex.: no snippet $5 inserimos um valor entre aspas, isso quer dizer que seu tipo deve ser String. Então, vamos testar.

Funny?

Então vamos deixar o negócio mais sério. Criar métodos? Passar parâmetro nos métodos? Sim, sim, por que não? O Jshell interpreta e entende as linhas de código, ele aceita que criemos métodos e até classes.

Vamos criar um método que apenas retorna uma frase:

Conforme vamos escrevendo nosso método, ao apertar enter o shell entende que ainda não é o momento de criar um objeto, um método, uma classe ou o que seja, visto que antes de apertarmos o enter abrirmos o método com { e apenas quando fechamos ele } e pulamos a linha que o método será criado. Lembra do comando para visualizar os snippets que já criamos?

Note, dentro do snippet 1 o método que acabou de ser criado foi armazenado. E para chamar nosso método basta digitar o nome dele:

Legal? Vamos agora criar um método com parâmetros, que vamos passar assim que fizermos a sua chamada. Esse método, apesar de ser simples, temos que prestar atenção em sua escrita no terminal, pois pode causar um pouco de confusão até pegarmos prática, tudo bem? Esse método apenas vai fazer um loop 10x a partir do valor passado no parâmetro inteiro.

E nosso método foi criado… Sempre que alguma coisa na escrita estiver inconsistente, o shell irá dar o feedback da inconsistência. Para testar nosso método, basta chamarmos passando os dois parâmetros: o primeiro uma string e o segundo um inteiro.

E tem mais, caso queira editar seu método é possível, basta sabermos qual o ID correspondente a ele. Para isso, basta digitarmos /list e o nome do método que foi criado. OBS: lembre-se que o Jshell tem autocomplete.

Veja, o nosso ID é 1 e para editar o método basta digitar “/edit 1”. Nesse momento um editor padrão vai ser aberto, o “(Jshell Edit Pad)”. É possível trocar o editor padrão (eu particularmente gostei do default), mas caso queira utilizar o VI, EMACs, NANO ou qualquer outro basta digitar /set editor {e_o_nome_do_editor}. No exemplo, vou de JEP mesmo.

Esta é a interface do editor:

Bem tranquila, certo? Não tem segredo, para usar basta realizar as alterações e depois accept; exit para fechar.

Para nossa alteração, lembra que é possível criarmos classes também? Então vamos envolver nosso método com uma classe, vou chamá-la de MeuTeste:

Note que ao fechar o editor o shell vai lhe dar o seguinte feedback:

E para testar, sem novidades.

Da mesma forma que podemos editar um snippet salvo, podemos também excluir. Para isso, basta você saber o ID do método, ou classe ou whatever que quer excluir. Como criei uma classe para o método que estávamos testando, vou excluir agora o método que ficou para trás:

E lá se foi ele. Existem outros comandos que podem ser úteis para nós…. /type (lista classes) | /methods (nem preciso dizer né) | /vars ( ¯\_(ツ)_/¯ ) ….

Outra coisa, podemos usar também imports, por isso vamos fazer um teste, alterando o método da classe que criamos. Vai ser algo bem simples: adicionamos no log do nosso console um recurso de data do Java 8. Com isso conseguimos realizar um import.

Veja, apenas adicionei um parâmetro a mais no printf e Instant.now() para pegar o momento de cada print.

Agora vamos chamar essa nossa classe para testar o método.

Ops, algo deu errado. O shell reclamou da classe Instant. Será que é por que ela faz parte do pacote java.time.Instant e não fizemos o import dele em nenhum lugar? Como essa classe não faz parte dos pacotes default, vamos importá-la, então.

No terminal vamos digitar:

Feito isso, podemos executar novamente nossa classe para testar nosso método.

Legal, né? Caso queira ver quais pacotes estão importados no shell é só digitar /import

E tem mais! Dá olha olhada nessa documentação do Jshell no site da Oracle. Tem mais um monte de coisas legais lá.

Por hoje é só pessoal, espero que tenham gostado. Ah, é claro. Para sair do Jshell basta digitar /exit =)

See you!

É desenvolvedor Java e gostaria de trabalhar em um time ágil e multidisciplinar? Clique aqui!