设为首页 加入收藏

TOP

JShell:Java REPL综合指南(二)
2018-10-10 04:12:21 】 浏览:428
Tags:JShell Java REPL 综合 指南
绍)以及任何有效或无效的片段。JShell会根据片段的类型给每个片段ID添加一个前缀。下面是快速确定其意义的方法:


JShell提供了多个命令帮助你查看shell的当前状态或上下文。它们都有恰当的名称,而且简单易懂,但是完备起见,我们把它们都列在这里。


你可以使用/vars查看声明的所有变量和它们的值。


你可以使用/methods命令列出声明的所有方法和它们的签名。


你可以使用/types命令列出所有类型声明。


你可以使用/imports命令列出当前声明的所有导入。


最后,你可以使用/reset命令重置和清理包括变量、方法和类型在内的所有状态。


/edit用于编辑之前输入的片段。Edit命令适用于所有类型的片段,包括有效的、无效的和启动片段。它特别适合编辑产生了错误的多行代码,使你不必重新输入任何东西。


在上文中,当把变量greeting和audience串联成变量saying时,“hello”和“world”之间少了个空格。你可以通过输入/edit和片段ID来编辑。JShell Edit Pad会弹出来,你可以根据需要做任何修改。你还可以使用变量名称代替片段ID。


编辑完成后,你可以点击Accept按钮,JShell将对编辑后的片段重新求值。如果重新求值发现片段没有包含任何错误,则给编辑后的片段赋予一个新的片段ID。


你还可以给/edit 传入一个范围或多个ID,一次编辑多个片段。


/drop用于删除之前的任何片段。


除了编辑行,你还可以选择使用/drop命令删除它。它的用法和edit命令一样,你可以使用片段ID、变量、范围或者它们的组合作为参数。


/save使你可以把之前输入的片段的输出保存到一个文件。


除了保存输出的文件,/save命令还接收另外的参数,用于指定需要保存的片段ID。该参数的用法和/edit及/drop命令的一样,位于文件名参数之前。


如果未指定任何片段ID,则保存之前输入的所有片段。


/save和/open命令(下文介绍)搭配使用会非常有用,可以用于保存当前会话,并稍后恢复。要保存当前会话,包括所有的错误,调用/save命令,传入参数-all。


/open命令可以打开之前保存的任何输出,并对其重新求值(包括错误!)


为方便使用,JShell还提供了一些预定义的“文件名”:


例如,如果你不想每次都使用System.out.println打印东西,那么你可以打开PRINTING文件,该文件定义了许多快捷方法,其中有一个名为print。


为了充分利用JShell,你应该了解其中一些常见和有效的用法。


JShell特别适合于以下场景:


对于Java,我们都有可以提高的地方。不管是泛型,还是多线程,JShell都是一个非常有效的学习工具。


JShell之所以会成为一个很棒的学习工具是因为它提供了一个持续不断的反馈循环。你输入一个命令,它告诉你结果。就是这么简单。而且,虽然很简单,但很有效。像俗话说的那样,它让你可以“快速行动,推陈出新”。


Java语言不断发展和增加新API(比过去任何时候都快)。


例如,考虑下Java 8中引入的Streams API。这是JDK的一个重要补充。有许多东西需要探索。但是,在Java 8中,Streams API还不完善。Streams API是一个处于不断演化中的API,Java 9 和Java 10都添加了新特性和功能。


下次,你想要探索Java的新特性时,可以考虑使用JShell。


我们都会遇到原型化想法的情况。在那些情况下,你通常发现自己在创建一个新的测试项目,编写JUnit测试,或者编写一个具有main方法的简单Java类。有点仪式化,实际上有点麻烦!


JShell是一个非常有效的测试新想法的工具。你不必编写单元测试,或者是具有main方法的简单Java类,你可以使用JShell,借助命令行,或者/open命令和一个预先编写好的文件。借助JShell,下面这些事情你就不需要做了:


总之,所有这些都相当于加速了“想法转化”。


JShell使用JLine2驱动命令行。这相当于Java中的GNU ReadLine,使你可以编辑或浏览在命令行上输入的命令。所有现代化的shell,如Bash,都使用它(这就是你为什么不能使用CTRL-V在shell中粘贴)。这就是说,JShell有一些非常强大的“快捷方式”。


以下是其中最常用的一些:


在加载外部类库时,如果要输入完整的路径会非常恼人。因此,你可以把当前路径改成所有外部类库所在的路径,从那个目录启动jshell,使用星号(用引号引起来)包含所有的jar包。这适用于所有操作系统。


同样的命令也适用于路径。该命令同样适用于所有的操作系统。


还有一个不错的建议:如果你已经输入了若干命令,但启动时忘了设置类路径,那么你可以使用/env命令设置类路径。


对于JShell,你可以维护一个常用类库、命令或片段的专用目录,从而节省大量的时间。


对于新手,你可以从我GitHub上的示例库生成分支。


那个库包含如下几个目录:


让我们逐个看一下。


Imports


该目录包含预先定义好的常用导入。


随着使用JShell越来越多,你会发现,在想要使用或试验一个特定的外部类库时,重新输入一堆导入语句会变得非常痛苦。


为此,你可以把所有必要的导入语句保存到一个文件中,然后利用/open命令把它们引入进来。


定义导入文件的粒度由你决定。你可以选择针对每个库定义(例如guava-imports)或针对每个项目定义(例如my-project-imports),或者其他最适合你的方式。


Libs


该目录几乎不需要再多加说明了,其中包含你可能在JShell中使用的所有外部类库。你可以选择任何你认为最有意义的方式组织你的库,不管是全部在一个目录中,还是一个项目一个目录。


不管你的组织策略是什么,使所有外部类库都以一种易于加载的方式组织最终会为你节省大量的时间,就像我们在类路径使用技巧部分看到的那样。


Startups


你可以使用这个目录存储任何启动或初始化代码。JShell使用参数--startup直接提供了对这一特性的支持。


本质上讲,这些文件和位于imports目录中的文件类型类似,但是,它们不只是导入。这些文件旨在包含初始化JShell环境所需的任何必要的命令、导入、片段、方法、类等。


如果你熟悉Bash的话,你会发现,启动文件和.bash_profile文件非常像。


Utils


我们都知道Java可以多繁琐。这个目录,正如它的名字那样,是为了包含任何工具或“快捷代码”,使你可以更愉快地使用JShell。这里,你存储的文件类型和JShell专门提供的PRINTING文件很相似,它定义了若干用于文本打印的快捷方法。


例如,如果你大量使用大数值,你每次想要加、乘、减一个数时都得输入类型new BigInteger,那你很快就会厌烦。为此,你可以创建一个工具文件,其中包含可以简化代码的辅助程序或快捷方法。


我得承认,当我第一次听说JShell时,我没怎么考虑它。我一直在使用其他语言的REPL,更多的是把它看作一种“玩具”而不是工具。不过,我用的越多,我就越认识到它的好处以及如何为我所用。


对我而言,我发现JShell最大的用处是学习语言新特性、加深对现有特性的理解、调式代码、试用新类库。在我的程序开发职业生涯中,我学会了一件事,就是我应该尽力缩短反馈循环,越短越好。我就

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇PHP类继承、接口继承关系概述 下一篇Python运算符及优先级顺序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目