Java9先睹为快:JShell动手实践
如何现在开始使用Java 9最酷特性之一?
上周我终于抽出时间亲身体验了一个Java 9 的抢先体验版本。第一站就是JShell,它也被称之为Kulla项目,这就是起初驱使我鼓起勇气去尝试Java9抢先体验版的原因。没错,官方的 Java 9发布时间目前定在2016年9月,但抢先体验版中已经有全功能的JShell。
新文章:Java9先睹为快:JShell编程实践——#Java REPL http://t.co/F8cQ9X5dQM pic.twitter.com/JoWR6i8PSz
—— Takipi (@takipid) 2015年7月7日
有趣的事实 1:Kulla项目是JShell研发团队的内部名字。Kulla是美索不达米亚神话中的建筑者之神,他在施工结束后被放逐。这是在暗示Kulla的用例(use case)是一种学习工具吗?
那么到底什么是JShell?
JShell/Kulla项目是第一个官方的Java REPL (Read-Eval-Print-Loop的缩写,即交互式编程环境),一种命令行工具。它允许你无需使用类或者方法包装来执行Java语句。它与 Python的解释器类似,或其它本地支持REPL的JVM语言,如Scala和Groovy。在Java 9即将到来的的特性中,这绝对是更有趣的特性之一。想了解正在来到你身边的JDK的更多有趣特性(Jigsaw项目除外!)你可以阅读早先我们关于Java 9的5大特性文章,这些特性可以改变你的编码方式。到现在为止,如果你要在Java中用REPL,你也可以使用替代方案,比如像具有多种语言支持的repl.it或非官方的Java REPL项目。不过使用Java9,REPL与langtools包一起直接捆绑到了JDK。
有趣的事实 2:另一个也有着神话般名字的OpenJDK项目就是Valhalla;其目标是超越Java 9,致力于数值类型和泛型具体化的特性研发。绝非善类。
废话少说,我们把它运行起来看看它能做什么。在下面很短的终端录制视频中,我们运行JShell v0.61完成一个快速测试(在OSX 10.10.3 中存在一个已知的问题,即提示与部分输出会混合显示在一起。无需在意,后续会被尽快修复)。
(译者注:JShell视频请参考原文)
回顾一下我们刚刚所看到的:JShell一些最有趣的特性
[8/7/2015] 更新:编辑于Brian Goetz的笔记,他是Oracle的Java架构师。
1、分号对于纯语句是可选的
Hello JShell! 基于REPL快速和灵活的特性,我们可以放松一下,不用在语句结束地方加分号:Hello JShell!
实际上,在我们发起的一个关于未来Java特性的调查中,该特性是受多数人认可的。当然分号仍被保留了下来,无论是作为终结符还是分隔符。REPL允许一次性键入纯表达式和语句,因此分号对于JShell终端用例是可选的。
2、REPL网络
使用JShell时,我们不会受限于机器和网络访问,这带来了一些有趣的机会。例如,想想把它当做一个终端来与服务器交流,远程连接到服务器并且从外面控制一些参数。另一个选择是查询数据库,这里真的是有无限可能。
3、Help!保存和加载工作空间
除了运行和计算Java语句,JShell支持一系列命令行来帮助你了解和浏览REPL环境。你可以保存和加载工作空间(这让Java有点像脚本语言),且全部代码执行完成后可以在命令行提示下返回(此时你可以在终端视频中看到我提到过的OS X bug)。
其它有用的命令行都列出了所有当前可以用的变量和方法,显示出你的所有历史命令,并且列出了目前为止你写过的所有代码(这个有时表现得还是有点奇怪)。
这是当前可用的完整命令列表:
4、没有受检异常
如果你一直担心受检异常会毁掉你的REPL经历——无需再担心,JShell在后台为你隐藏好了。在下面的例子中,本应当强迫我们捕获一个IOException,却没有出现。下面的例子是我们在读取和打印一个文件,不需要处理IOException。
有一种情况的确会有受检异常弹出,就是当我们尝试运行一个线程,并在里面使用了 Thread.sleep() 语句。由于这是一个整体的方法而非单独的纯语句,它必须是完全有效的Java语句:
5、Java表达式
JShell终端还可以自己计算Java表达式。字符串连接、方法回调、算法,诸如此类。基本上,任何你可以包装在 System.out.println(/ expression here /) 里的都可以计算。正如你可能已经知道到的其它计算方式,它会立即将结果赋给自己的一个变量并打印出来。
6、向前引用
JShell给向前引用提供了很棒的支持,所以你在定义方法时可以引用其他方法或变量,且这些方法或变量仅会在一段时间后被定义。这是AdoptOpenJDK提供的REPL指南中的一个例子:
7、JShell API
JShell除了可以作为单独的JDK工具,还可以提供一个API,它能对外部调用开放所有的功能。这意味着外部工具可以连接并使用JShell的功能,如此一些很有趣的可能性突然就被开发了出来,比如在Eclipse、IntelliJ或Netbeans之类的IDE中引用它。对于该API可能还有更多创造性的用例,例如利用该API来扩展静态分析的工具,自动化测试或者甚至是连接到实时的JVM。
8、在运行中修改定义
你可以重新声明变量、方法或者类,而无需担心原始的声明。一旦你这样操作了,就会收到一个信息提示你发生了什么,但除此之外一切照旧。
彩蛋:你所需要的都是爱
如果你去查找目录/repl/samples,将会发现这个使用Swing做出来的可爱样例,会给你画3颗小心心:
你自己如何开始使用JShell?
开始之前,看看Adopt OpenJDK上的说明书:伦敦Java社区(LJC)的入门套件。下面是步骤的快速摘要,来帮助你顺利开始。特别是如果你之前从未玩过Java抢先体验版本。
1、安装 Java 9抢先体验版本JDK
2.编译kulla-dev分支
3、编译REPL
4、然后……现在你可以准备运行了
对于OS X用户的重要提示:在运行 compile.sh & run.sh 之前,编辑这些脚本,把 #!/usr/bin/sh 修改为 #!/bin/sh。
如果对于该过程有任何疑问,请提交到下面的评论区,我们会尽可能给予帮助。
总结