BLOG

ブログ

JShellで気軽にJavaを始めてみた。

最近自宅用にメカニカルキーボードを購入して勉強している自分に酔ってる髙田です。

最近Javaを少しずつ勉強しているのですが、Java初心者にはありがたいJShellというツールを使ってみたので、備忘録として残したいなと思います!

JShellについて

即座にコマンドでJavaコードを試すことができるツールです!

Javaは処理を実行するため最低限下記の記述が必要になります。

class Hello{
    public static void main(String[] args) {
        System.out.println("Hello World");        
    }
}

クラス作成→処理を書く→コンパイル→実行…ちょっと確認したいだけなのに!とJava始めたての私には少し面倒だなと感じることもしばしば…。
(ホットデプロイ環境作れ!は一旦置いといて…)

そこでターミナルでさくっとJavaを動かすことができるツールがJshellになります!

さっそく使ってみましょう!

環境設定

Dockerをインストールされている方は、以下の手順でコマンドを叩いていただくとJShellをお試しいただけます!

//エイリアスを登録
alias jshell='docker run -it --rm openjdk:11-jdk jshell' 

//jshellと入力してEnter
$ jshell

JShell>

Jshellの終了タグである「/exit」を入力することでコンテナも削除されるため、ローカルに残る心配はありません。

もしDockerをインストールされていない方は、JDKをこちらからインストールしていただく必要があります。
お使いのOSに合わせてインストールをお願い致します。
https://www.oracle.com/java/technologies/downloads/

JShellでできること

先にJShellの終了方法ですが、「/exit」コマンドを実行します。

JShell> /exit

JShellコマンド一覧はこちらに記載されています。

ここからJShellでできることの一部をお見せしたいと思います!

演算子

jshell> 5 + 5
$1 ==> 10

「$1 ==>」のあとが結果になり、$1の部分は処理を実行するごとに増えていきます。

文字列の結合

jshell> "Marvericks" + "Corporation"
$2 ==> "MarvericksCorporation"

変数

変数の値は、メソッドやクラスなどでも使用できます。

jshell> var hoge = 123
hoge ==> 123

比較演算子

さきほど設定したhogeを使っています。

jshell> hoge > 100 ? "yes" : "no"
$3 ==> "yes"

配列

jshell> int[] array = {1, 2, 3}
array ==> int[3] { 1, 2, 3 }

jshell> array[0]
$4 ==> 1

メソッド

カッコを開いた状態で改行することで、メソッドなどの複数行の処理を実行することもできます!
編集中に抜けたい場合は、ctr + cで戻ることができますが、編集中コードは破棄されます。

jshell> int multiplied(int a, int b) {
   ...>  return a * b;
   ...> }
|  created method multiplied(int,int)

//変数hogeを使用。
jshell> multiplied(hoge, 5)
$5 ==> 615

メソッドの名前を忘れてしまったときや、メソッド一覧を見たいときは、
以下の例の場合、「”test”.」とドットまで入力した状態でTabキーを押すと一覧が表示されます。

jshell> "test".
charAt(                chars()                codePointAt(           
codePointBefore(       codePointCount(        codePoints()           
compareTo(             compareToIgnoreCase(   concat(                
contains(              contentEquals(         endsWith(              
equals(                equalsIgnoreCase(      getBytes(              
getChars(              getClass()             hashCode()             
indexOf(               intern()               isBlank()              
isEmpty()              lastIndexOf(           length()               
lines()                matches(               notify()               
notifyAll()            offsetByCodePoints(    regionMatches(         
repeat(                replace(               replaceAll(            
replaceFirst(          split(                 startsWith(            
strip()                stripLeading()         stripTrailing()        
subSequence(           substring(             toCharArray()          
toLowerCase(           toString()             toUpperCase(           
trim()                 wait(    

クラス

jshell> public class Person {
   ...>       private String name;
   ...>       public Person(final String name) {
   ...>             this.name = name;
   ...>       }
   ...>       public String getName() {
   ...>             return name;
   ...>       }
   ...> }
|  次を作成しました: クラス Person

jshell> Person hogehoge = new Person("Pikachu");

jshell> hogehoge.getName()
$6 ==> "Pikachu"

例外・構文エラー

例文

jshell> var fruits = List.of("banana", "apple", "orange")
fruits ==> [banana, apple, orange]

jshell> fruits.get(1)
$7 ==> "apple"

ではList.ofで指定したListに対して、addメソッドを使用してみると…

jshell> fruits.add("cherry")
|  Exception java.lang.UnsupportedOperationException
|        at ImmutableCollections.uoe (ImmutableCollections.java:72)
|        at ImmutableCollections$AbstractImmutableCollection.add (ImmutableCollections.java:76)
|        at (#9:1)

例外UnsupportedOperationExceptionが発生し、変更できないよと促してくれます。
at (#9:1)は例外が発生した場所になりますが、JShellではあまり関係ありません。

構文エラー

ArrayListオブジェクトで構文エラーを表示してみます。

jshell> var sample = new ArrayList<String>()
sample ==> []

jshell> sample.add("hoge1")
$8 ==> true

jshell> sample.add("hoge2")
$9 ==> true

//構文エラー
jshell> sample.add(1000)
|  Error:
|  incompatible types: int cannot be converted to java.lang.String
|  sample.add(1000)
|             ^--^

このように、int型をString型に変換できませんよ〜と構文エラーを表示して教えてくれます!

まとめ

かなり簡単なコードでご説明しましたが、こんなツールがあってこんな使い方ができるんだ〜と知っていただけたら嬉しいです!

Java難しそうだし、動かすまでの環境構築で断念しそう…
とりあえず動かしてみたいけどちょっとめんどくさそう…

という方にはぴったりなツールかなと思います!

がっつり開発したい!という方は、以前@かりーさんがJavaでホットデプロイ環境構築する記事を書いているので、こちらをお試しください!
https://ma-vericks.com/blog/spring-hotdeploy/

ではまた〜!

RELATED ARTICLE