IDEA2020新特性详解(转载)

就在前几天,Java软件开发神器 IDEA 2020.1 新版发布了:

image

我第一时间在机子上更新并体验了几天,感觉还是有点香的!怎么硕呢,体验完新特性之后,不由的感叹一句:IDEA现在真的是越来越智能,越来越懂开发者了。


UI/界面升级

1、界面支持中文了

汉化后的效果就是这个憨样子:

image

各花入各眼,好坏就不做评判了,可以根据自己的喜好来调节。

必须要说的是,这个中文汉化不是软件原生支持,而是需要下载安装一个名为Chinese (Simplified) Language Pack的插件,好在这个插件就是JetBrains官方提供的

image

2、导航栏进化

现在代码层级导航栏这里,可以直接定位到文件中的某个具体方法或者字段了,这个的确很高效

image

3、支持编辑器内的Javadocs渲染

以前在IDEA中阅读Javadoc非常不方便,因为处于原始状态的Javadoc中含有各种标记,不好读。这次新版的IDEA 2020新增了Javadocs的渲染功能,点击左边的小按钮就可以启用

image

渲染后的Javadoc就非常直观易读了,而且还可以调整字号

image

4、新增主题和字体

首先默认支持了JetBrains自家的新JetBrains Mono字体,这没啥可说的,之前就体验过了,详细可参考前文《试水JetBrains官方新编程字体,真香!》

image

然后则是采用了统一的IntelliJ Light主题,而且该主题已经在不同的操作系统中完全统一了

image

image

喜不喜欢看大家个人习惯了。

5、船新的LightEdit模式

LightEdit,顾名思义,轻量级的代码编辑。

是的,这次更新的IDEA支持打开单个代码文件进行编辑,而无需打开整个项目。文件可以在单独的编辑窗口打开,而且该窗口可以和其他(项目)窗口共存。就像这样:

image

更强大的是,直接支持快捷打开这个单文件所在的完整项目:

image

甚至还可以通过命令行来打开单文件,这相当可以了:

image

6、支持“禅”模式

现在的这个代码展示模式有够丰富了,支持四种了:

image

当然,禅模式是最彻底的,一开这个模式,整个世界都清净了…

image

7、终端支持分栏了

现在可以随意地将IDEA自带的终端进行横竖分栏,非常方便

image


支持直接IDEA里安装JDK和Git

很多小伙伴交流说自己JDK环境好像装的有问题,实验各种出问题。为了这个事,强迫症都快犯了,很烦。

从IntelliJ IDEA 2020.1开始,我们可以直接在创建项目时,直接从IDEA上下载并设置JDK环境,很方便了。

我特地实验了一下,在IDEA里面下载安装了个Open JDK 14,没毛病,好用,切换也很方便。

image

image

除此之外,IDEA还直接支持Git的安装,i了i了

image


支持Java 14新特性

前段时间Java 14发布,加入了一些新特性,这次IDEA 2020.1迅速跟进,支持了Java 14的一些新特性,举两个典型的例子。

1、instanceof用法增强

老的Java版本中,对于instanceof语法,我们一般都是这样用的:

private void test( Object obj ) {
    if( obj instanceof String  ) {
        String str = (String) obj;  // 需手动强制转换!
        System.out.println( str.isEmpty() );
    }
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

而Java 14对instanceof用法做了增强,我们借助全新的IDEA 2020,可以快捷的将上面的代码自动重构成如下所示:

image

所以最终变成了这个亚子:

private void test( Object obj ) {
    if( obj instanceof String str ) { // 校验通过,直接后面定义变量,无需强转!
        System.out.println( str.isEmpty() );
    }
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5

2、record新语法支持

Java 14新增了record新语法,record的词面意思就是 “记录”,主要用于形式化的固定记录,这在以前主要就是通过 不可变类来实现的,举个例子吧。

比如我们定义一个不可变的日志记录类LogRecord,里面包含日志ID(id),日志时间(date),日志详情(detail),按照老的做法,只能使用class进行定义:

public final class LogRecord { // 不可变类
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token keyword">int</span> id<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> LocalDate date<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> String detail<span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token function">LogRecord</span><span class="token punctuation">(</span><span class="token keyword">int</span> id<span class="token punctuation">,</span> LocalDate date<span class="token punctuation">,</span> String detail<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>id <span class="token operator">=</span> id<span class="token punctuation">;</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>date <span class="token operator">=</span> date<span class="token punctuation">;</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>detail <span class="token operator">=</span> detail<span class="token punctuation">;</span>
<span class="token punctuation">}</span>


<span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getId</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> id<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> LocalDate <span class="token function">getDate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> date<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> String <span class="token function">getDetail</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> detail<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> String <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token string">"LogRecord{"</span> <span class="token operator">+</span>
            <span class="token string">"id="</span> <span class="token operator">+</span> id <span class="token operator">+</span>
            <span class="token string">", date="</span> <span class="token operator">+</span> date <span class="token operator">+</span>
            <span class="token string">", detail='"</span> <span class="token operator">+</span> detail <span class="token operator">+</span> <span class="token string">'\''</span> <span class="token operator">+</span>
            <span class="token string">'}'</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">equals</span><span class="token punctuation">(</span>Object o<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span> <span class="token operator">==</span> o<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>o <span class="token operator">==</span> null <span class="token operator">||</span> <span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> o<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    LogRecord logRecord <span class="token operator">=</span> <span class="token punctuation">(</span>LogRecord<span class="token punctuation">)</span> o<span class="token punctuation">;</span>
    <span class="token keyword">return</span> id <span class="token operator">==</span> logRecord<span class="token punctuation">.</span>id <span class="token operator">&amp;&amp;</span>
            Objects<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>date<span class="token punctuation">,</span> logRecord<span class="token punctuation">.</span>date<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span>
            Objects<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>detail<span class="token punctuation">,</span> logRecord<span class="token punctuation">.</span>detail<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">hashCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> Objects<span class="token punctuation">.</span><span class="token function">hash</span><span class="token punctuation">(</span>id<span class="token punctuation">,</span> date<span class="token punctuation">,</span> detail<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

Java 14认为上面这种final类型class的定义的套路是完全固定的,写了很多固定套路的代码,包括:构造函数、Getter方法、toString()方法、hashCode()equals()方法等等,十分无聊。

为此Java 14推出了全新的record语法,只需一行代码即可搞定,十分方便:

record LogRecord( int id, LocalDate date, String detail ) {

}

  • 1
  • 2
  • 3

这次IDEA 2020中就已经完全支持recod语法了,并且还可以自动显式地为record生成各种方法:

image


支持更加智能的检查和重构

1、支持就地更改方法签名

什么意思呢?举个例子。

当你想直接修改某个已有方法的参数时,不管三七二十一,上来可以直接修改方法签名,然后点击更新,接下来的所有步骤IDEA可以帮你完成。

image

image

image

image

2、智能分析日期字符串格式

比如这个例子中,我格式化一个日期时,无意将年月日yyyy/MM/dd字符串写成了yyyy/mm/dd,中间的MM大小写忘了,IDEA自动给我们分析出来了:

image

3、智能语法和拼写检查器

这个功能得配合Grazie这个插件一起使用,该插件是一个全面的语法、拼写、以及样式检查工具。

比如,这地方我小手一抖,写错了英语语法,它立马帮我们提示出来了

image


增强调试功能

1、数据流分析辅助,可以直接预测下面的运行结果

IDEA 2020.1直接将数据流分析添加到JVM调试器。当程序在断点处停止时,IDEA可以根据程序的当前状态运行数据流分析,来预测下一步将要发生什么。

image

2、调试时,支持固定对象字段

当一个对象字段过多,以致于调试时很难找到需要的字段时,我们可以直接将其置顶,便于查看。

image

3、以文件形式存储运行配置

新版IDEA支持直接将当前的调试/运行的配置存档,并在以后选择重新加载

image


更加先进的版本控制

第一个大的改进就是重新设计了代码提交的窗口,而不再是以前老的那种模态化弹窗式窗口了。这样一来,提交代码时的代码比对,编辑会更加舒适。

image

第二个改进就是支持搜索刷新本地以及远端的代码分支:

image

另外,这个历史日志留痕也是蛮好看的:

image


Maven和Gradle导入更新

此处就以Maven工具为例,编辑器右上角出现的是一个浮动通知。修改构建文件后,可以使用这个迷你的通知图标来加载更改。

image


数据库处理增强

新版IDEA内置的数据库管理,现在可以支持将数据导出到Excel(.xlsx)文件,并且直接在编辑器中以文本形式查看

image


增强的HTTP Client

升级之后的HTTP Client更加智能,典型的比如:支持自动匹配和补全

image

而且还可以在Contoller代码的左侧,通过快捷的方式来自动生成HTTP请求文件

image

而且对于Spring项目,还可以在底部的Endpoints窗口里来快捷生成HTTP请求文件。

image


其他改进

1、对各种框架的支持改进,比如:Spring WebFlux/Selenium/JMS/Micronaut/RxJava等等

2、对Docker/Kubernetes的支持改进

3、对Scala 3的支持

4、对Android Volley的支持

5、对JavaScript的改进和支持


小结

体验一番之后发现,新版的IDEA 2020.1肉眼可见的改进还是非常多的,挺香。

不过还有一个实际的问题就是:我一升级之后发现一大票的插件都不能用了,所以周边支持的兼容性还得再等等。

转载自博客:https://blog.csdn.net/wangshuaiwsws95/article/details/105528959?utm_medium=distribute.pc_feed.none-task-blog-alirecmd-12.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-alirecmd-12.nonecase&request_id=
                                </div><div data-report-view="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wangshuaiwsws95/article/details/105528959&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                            </div>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值