IntelliJ IDEA最佳实践

  1. Intellij IDEA for Java WEB 开发

    • 快捷键

    • 插件

    • 快速测试

    • Java工具包

  2. Intellij IDEA for Scala 开发(ing)

  3. Intellij IDEA for Kotlin 开发(ing)

Note
如无特殊说明, 本文基于Mac OS 及Intellij IDEA 2020.1.x,
涉及系统或版本差异时会就近补充说明,
总体上: Mac的 cmd 等价于Windows的 ctrl ,
Intellij IDEA高版本功能是兼容低版本功能的, 只是部分插件会受到一些影响

快捷键

  • 找到所有快捷键, Help -→ Keymap Reference, 出现的PDF展示了当前你的编辑器的所有快捷键

  • 确实有点多, 不着急, 知道了方法, 后续只是时间问题. 如何搜索快捷键, 参见下图

Shortcut
Figure 1. 如何搜索快捷键
Table 1. 10个高频快捷键
功能 关键词 示例(默认)快捷键

①语句自动完成

Complete statement

cmd + shift + enter

②复写(父类)方法

Override methods | Generate

ctrl + O | ctrl + enter

③智能提示|纠错

Show Context Actions

ctrl + shift + alt + enter

④快速复制粘贴

Duplicate Line or Selection

cmd + D

⑤查看方法调用

Call Hierarchy

ctrl + alt + H

⑥跳转到父类申明

Go to Super Method

cmd + U

⑦跳转到子类实现

Go to Declaration or Usages

cmd + B

⑧拼接下一行

Join Lines

ctrl + shift + J

⑨优化导包

Optimize Imports

ctrl + alt + O

⑩格式化代码

Reformat Code

cmd + alt + L

更多彩蛋

安装插件 Key Promoter X

对于有快捷键的按钮, 当你点击时提示告诉你快捷键

插件

  • Key Promoter X

    • 快捷键提示, 新手必备, 而老手也可以通过它得知新版IDEA的一些特性信息

  • Rainbow Brackets

    • 代码括号自动匹配, 彩板护眼

  • Lombok

    • 这位都听说过吧, 没听过的要么是大佬要么改行吧

    • 采坑经验, 使用Lombok时, 尽量避免对象间继承, 如果非要继承, 应考虑@EqualsAndHashCode(callSuper = true : false)

    • 示例:

/**
 * balabala
 *
 * @author Mr.X
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class PormHub extends GitHub{
    private Boolean well = Boolean.FALSE;
}
  • AsciiDoc

    • 文档编辑神器, AsciiDoc本身目标是制作大型电子书, 超越MarkDown, 本文就是用AsciiDoc书写完成的

    • Spring官方、Spring-Alibaba官方都采用AsciiDoc撰写文档, GitHub也支持AsciiDoc, AsciiDoc是未来的主流, MarkDown貌似要成替补了

    • 个人使用体验, 对于写技术文档, 上手快, 简洁, 本文的一个小目标就是为新手提供常用的模块, 支持ctrl + c | v

AsciiDoc
Figure 2. AsciiDoc文档速览
  • Translation

    • 作为中国程序员, 英语不会咋办?

    • 安装该插件, 选中任意文本, ctrl + alt + T 一键翻译

  • iBATIS/MyBatis mini-plugin

    • 对于采用Mybatis且保留SQL的方式, 从Mapper接口跳转到对应SQL处, 可以借助该插件完成

    • 当然现在有很多采用无SQL的方式, 参见 苞米豆

  • MavenHelper

    • 国内Java工程多采用Maven来管理依赖, 对于一些不讲究的老项目, 依赖纠缠不清, 这个时候咋办?

    • 就这样, 凉拌吧!

    • 又或者, MavenHelper带你浴火重生, 请看下图

MavenHelper
Figure 3. MavenHelper特性速览
  • SequenceDiagram

    • 当我们跳槽后接坑时, 代码的链路是怎样的, 怎么没完没了呢?

    • 这个时候, SequenceDiagram带你一览全貌

    • 方法调用时序图出来了, 慢慢瞅吧!

SequenceDiagram
Figure 4. SequenceDiagram特性速览
  • D8gerAutoCode

    • 作为Web开发, 当业务理解清楚后, 开发过程就可以量化如下:

      1. 表设计

      2. SQL → Mapper → Mo → → handler → Service → Controller

      3. 自测

      4. 联调

      5. PM加需求, 再改一波…​

    • 在上诉步骤中, 我认为1、2、3步是自己可以控制的, 且步骤2中除了Service层代码由业务决定外, 其他基本代码基本如出一辙

    • 这意味着什么?

    • 据我的观察, 1-3年的大部分程序员就在写这些重复代码, 有时写错或者抄错了, 到调试时定位到问题, 真的浪费不少时间…​

    • 好在不少前辈通过创建工具, 以逆向工程方式生成生产环境可用的基础代码, 操作嘛也比较简单, 定义好SQL, 编写配置文件然后运行main方法生成

    • 我的编码生涯里也有不少这样的回忆, 只是里面仍旧有不少重复操作, 甚至多人操作时会产生冲突

    • 于是, 我从Mo出发, 写了D8gerAutoCode这个插件, 一切以表设计为核心, 你专注设计好Mo就可以, 其他基本代码使用快捷键一键搞定

    • 如果D8gerAutoCode只有这个功能, 那其实和其他大佬插件相比没有啥可比性, 大家都用习惯了, 为何要使用新的呢?

    • 重点来了: D8gerAutoCode插件专注解决重复, 在平常工作中的重复工作应该被简化, 在我看来, 程序的初衷不就是如此吗?

    • 所以, D8gerAutoCode插件还带有字符串批处理, JSON处理, MySQL处理, 字段命名处理, 针对SwaggerAPI文档的处理, 这些功能是项目开发中都会用到的, 本着一键搞定原则而开发, 欲知详情参见后文

D8Config
Figure 5. 插件配置
D8Generate
Figure 6. 生成代码
D8String
Figure 7. 字符串批处理
D8Format
Figure 8. 格式化
D8Regrex
Figure 9. 正则彩蛋

快速测试

  • 基于接口进行Http测试

  • 整合Swagger-API, 代码及文档, 且支持文档界面进行调试(ing, 后续补充对应的Java实现代码)

  • 项目中涉及登录权限等问题, 在HTTP测试时应尽量模拟全, 为前端联调创造真实环境

  • 辅助工具

function downLoadResponse() {
    echo "执行命令内容: \n    http --verify=no -v --session-read-only=~/session-cookie-read-only.json POST ${1} < ~/Desktop/ssoLogin/requestBody.json -d >>~/Desktop/ssoLogin/ResponseBody.json ${@:2}\n"
    http --verify=no -v --session-read-only=~/session-cookie-read-only.json POST ${1} < ~/Desktop/ssoLogin/requestBody.json -d >>~/Desktop/ssoLogin/ResponseBody.json ${@:2}
}

function downLoadExcel() {
    echo "执行命令内容: \n    http --verify=no -v --download  --session-read-only=~/session-cookie-read-only.json POST ${1} < ~/Desktop/ssoLogin/requestBody.json -o ${2}"
    http --verify=no -v --download  --session-read-only=~/session-cookie-read-only.json POST ${1} < ~/Desktop/ssoLogin/requestBody.json -o ${2}
}

function show() {
    echo "执行命令内容: \n    http --verify=no -v --session-read-only=~/session-cookie-read-only.json POST ${1} < ~/Desktop/ssoLogin/requestBody.json ${@:2}\n"
    http --verify=no -v --session-read-only=~/session-cookie-read-only.json POST ${1} < ~/Desktop/ssoLogin/requestBody.json ${@:2}
}

# 开发环境机器
function xDev() {
    # 借助sshpass工具, 将服务器密码保存在文件第一行, 实现自动登录; 且-t 参数支持登录后跳转到指定目录
    sshpass -f /Users/D8GER/Desktop/CAOFAN/sshpass/caofan-ssh-dev.txt  ssh Mr.X@xxx.xx.xx.${1}  -t  'cd /XXX/logs/; exec $SHELL'
}

# 将HTPP请求的响应结果存入指定文件中, 示例: https-downLoadResponse https://www.baidu.com/
alias https-downLoadResponse='downLoadResponse'
# 在控制台展示完整的HTTP请求过程, 响应打印在控制台, 示例: https-show https://www.baidu.com/
alias https-show='show'
# 对于文件下载, 通过输入参数指定下载后的文件名, 示例: https-downLoadExcel https://www.baidu.com/file/123456 D8ger.zip
alias https-downLoadExcel='downLoadExcel'
# 对于开发测试环境多服务器, 简化为: xDev 99, 则自动登录xxx.xx.xx。99服务器
alias 'xDev=xDev'
登录获取COOKIE
调用HTTP接口进行测试

IMPORT: 采用这种方法, 可以告别PostMan或PostWoman及其他软件了, 你只需要Intellij IDEA + iterm2|xshell + python环境

Java工具包

  • Intellij IDEA代码简化模板, 这个技巧很香的, 比如常见的判断字符串不为空, 我只需要敲下fsnb, 就会得到如下代码

if (StringUtils.isNotBlank(光标在这)) {

}

话不多说, 常用模板定义如下:
/apim : SwaggerModel字段属性模板

oin  : 对象为null         ==> Objects.isNull()
onn  : 对象不为null       ==> Objects.nonNull()
o2e  : 两对象相等          ==> Objects.equals(, )
one  : 两对象不相等        ==> !Objects.equals(, )
foin : 判断对象为null      ==> if (Objects.isNull()) {}
fonn : 判断对象不为null    ==> if (Objects.nonNull()) {}
fo2e : 判断两对象相等      ==> if (Objects.equals(, )) {}
fone : 判断两对象不相等    ==> if (!Objects.equals(, )) {}

cie  : 集合为空           ==> CollectionUtil.isEmpty()
cne  : 集合不为空          ==> CollectionUtil.isNotEmpty()
sib  : 字符串为空          ==> StringUtils.isBlank()
snb  : 字符串不为空        ==> StringUtils.isNotBlank()
fcie : 判断集合为空        ==> if (CollectionUtil.isEmpty()){}
fcne : 判断集合不为空      ==> if (CollectionUtil.isNotEmpty()){}
fsib : 判断字符串为空      ==> if (StringUtils.isBlank()) {}
fsnb : 判断字符串不为空    ==> if (StringUtils.isNotBlank()) {}
代码模板
  • 高频工具包, 推荐GitHub开源项目 D8gerStarters

    • 通用工具包子项目 spring-cloud-starter-d8ger-common-util

      1. 集合流式处理工具CollectionUtil, 分组、求和、排序应有尽有, 基本可以告别for循环

      2. 树形处理工具WrapTreeUtil, 列表与树的多种转换骚操作也是应有尽有, 并且具有无侵入性, 开箱即用

      3. 数字精度运算工具NumberUtil, 金额进度计算, 精准百分比

      4. 枚举处理规范IEnum, 为项目打好根基, 规范枚举值用

  • 中间件可插拔Starters整合工具包, 推荐GitHub开源项目 D8gerStarters

    • 通用工具包子项目 spring-cloud-starter-d8ger-web-util

      1. 整合常用中间件, 例如业务线程池、邮件、Redis缓存、RestTemplate调用、消息队列、接口响应消息转换器、SwaggerAPI文档处理器

      2. 开关型可插拔, 默认有一套经过大型生产环境检验过的配置, 支持通过配置文件更改配置

      3. 保留扩展点, 通过继承等方式覆盖原有组件

总结

  • 3个开源项目相辅相成, 目的与Spring等框架一致, 解决’最后一站’的重复问题, 以工具的使命提高编码效率, 让我们专注于业务开发

  • 捐赠|Donate, 实践撰文分享实属不易, 您的支持能为更多省时省事的分享提速, 如果💰不行, 那就帮上面的开源项目点量⭐吧, 谢谢!

D8WZ