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时,我们不会受限于机器和网络访问,这带来了一些有趣的机会。例如,想想把它当做一个终端来与服务器交流,远程连接到服务器并且从外面控制一些参数。另一个选择是查询数据库,这里真的是有无限可能。

用JShell来获取一个HTTP请求header的简单例子

3、Help!保存和加载工作空间

除了运行和计算Java语句,JShell支持一系列命令行来帮助你了解和浏览REPL环境。你可以保存和加载工作空间(这让Java有点像脚本语言),且全部代码执行完成后可以在命令行提示下返回(此时你可以在终端视频中看到我提到过的OS X bug)。

其它有用的命令行都列出了所有当前可以用的变量和方法,显示出你的所有历史命令,并且列出了目前为止你写过的所有代码(这个有时表现得还是有点奇怪)。

这是当前可用的完整命令列表:

JShell /help

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颗小心心:

Java <3 REPL

你自己如何开始使用JShell?

开始之前,看看Adopt OpenJDK上的说明书:伦敦Java社区(LJC)的入门套件。下面是步骤的快速摘要,来帮助你顺利开始。特别是如果你之前从未玩过Java抢先体验版本。

1、安装 Java 9抢先体验版本JDK
2.编译kulla-dev分支

hg clone http://hg.openjdk.java.net/kulla/dev kulla-dev
cd kulla-dev
bash configure –with-boot-jdk=/path/to/jdk1.8.0
make clean images
make install <=== optional

3、编译REPL

cd langtools/repl
bash ./scripts/compile.sh

4、然后……现在你可以准备运行了

bash ./scripts/run.sh

对于OS X用户的重要提示:在运行 compile.sh & run.sh 之前,编辑这些脚本,把 #!/usr/bin/sh 修改为 #!/bin/sh。

如果对于该过程有任何疑问,请提交到下面的评论区,我们会尽可能给予帮助。

总结

很兴奋能够看到Kulla项目日趋成熟,最终将达到功能齐全的状态。JShell有很广泛的用例,但是首要的是能帮助新的和现有的开发者快速测试他们新学会的技巧。基本的Java或新的类只是让你开始充实大脑。此外,在当下这段时间,JShell使得Java与其它拥有这些功能的语言处于同等水平,或许未来还可以在官方的API和流畅的命令行体验下,开创新的思路。

原文链接: takipi 翻译: ImportNew.com - 无名侠女谭
译文链接: http://www.importnew.com/16353.html
[ 转载请保留原文出处、译者和译文链接。]

关于作者: 无名侠女谭

熟悉 java、liunx、php、mysql、hadoop、storm、hbase、redis、spring 等技术,在自动化测试、持续集成等领域有丰富经验。

查看无名侠女谭的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部