前言

遇到业务逻辑很复杂的模块,有时候一个方法一写就好几百行。这个时候很多代码可以抽成一个方法,从而使业务逻辑很复杂的方法变得易读。当然,你必须要在关键的地方写上注释,方便后面的人维护。
Idea提供了一个抽取功能,可以将变量、代码块等抽取出来,减少重复代码,提高代码可读性。
用来重构代码,非常方便快捷。开发效率也会提高!!

具体操作

抽取方法的快捷键是 Ctrl + Alt + M,其中 M 代表 Method,即方法。
以下代码分别演示了抽取前,抽取后的变化,可以看出抽取后的代码结构更清晰简单,阅读性更好。

提取前:

// 大转盘 设置某用户下次必中某商品
public void updateTurntableNextAward(Integer userId, Integer awardId, HttpServletRequest request) {//验证奖品BsTurntableAward award = turntableAwardMapper.selectByPrimaryKey(awardId);if (award == null) {throw new BusiException(E.INVALID_PARAMETER, "奖品不存在");}if (award.getState() != 1) {throw new BusiException(E.INVALID_PARAMETER, "奖品已停售");}Jedis jedis = RedisPool.getJedis();SysUser sysUser = (SysUser) request.getSession().getAttribute(R.LOGIN_USER);try {if (jedis.hexists(Rkey.USER_INFO, userId.toString())) {String hget = jedis.hget(Rkey.TURNTALE_NEXT_AWARD, userId.toString());if (StringUtils.isEmpty(hget)) {//第一次设置BsTurntableNextAward record = new BsTurntableNextAward();record.setAwardId(awardId);record.setState(0);record.setUserId(userId);record.setSysUser(sysUser.getUserName());turntableNextAwardMapper.insert(record);//修改必中商品的已抽取库存总量:extractAmount + 1turntableAwardMapper.updateExtractAmountAddOneByAwardId(awardId);//新增操作,redis 对应商品总投放量加一jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, awardId.toString(), 1);//操作数据库 商品对应投放库存加一 //下面这部分可以抽取为1个方法,选中这部分,按下快捷键 Ctrl + Alt + M,填写方法名称即可抽取Date now = new Date();String formatDate = DateUtil.formatDate(now, "yyyy-MM-dd HH:mm");BsTurntableActivity nowPeriodActivity = turntableActivityMapper.queryNowPeriodActivity(formatDate);String curActivityId = nowPeriodActivity.getId().toString();BsTurntableActivity turntableActivity = new BsTurntableActivity();turntableActivity.setId(curActivityId;if (nowPeriodActivity.getAwardId1().equals(awardId)) {turntableActivity.setAmount1(nowPeriodActivity.getAmount1() + 1);} else if (nowPeriodActivity.getAwardId2().equals(awardId)) {turntableActivity.setAmount2(nowPeriodActivity.getAmount2() + 1);} else if (nowPeriodActivity.getAwardId3().equals(awardId)) {turntableActivity.setAmount3(nowPeriodActivity.getAmount3() + 1);} else if (nowPeriodActivity.getAwardId4().equals(awardId)) {turntableActivity.setAmount4(nowPeriodActivity.getAmount4() + 1);} else if (nowPeriodActivity.getAwardId5().equals(awardId)) {turntableActivity.setAmount5(nowPeriodActivity.getAmount5() + 1);} else if (nowPeriodActivity.getAwardId6().equals(awardId)) {turntableActivity.setAmount6(nowPeriodActivity.getAmount6() + 1);}} else {//替换操作Integer oldAwardId = Integer.valueOf(hget);// 查询用户是否有 没有抽取的必中记录BsTurntableNextAward record = turntableNextAwardMapper.queryDataByUserAndState(userId, 0);if (record != null) {record.setAwardId(awardId);record.setSysUser(sysUser.getUserName());turntableNextAwardMapper.updateByPrimaryKeySelective(record);//修改之前设置的必中商品已抽取库存总量:extractAmount - 1turntableAwardMapper.updateExtractAmountReduceOneByAwardId(oldAwardId);//修改必中商品的已抽取库存总量:extractAmount + 1turntableAwardMapper.updateExtractAmountAddOneByAwardId(awardId);}//更新替换操作,原有商品总投放量减一jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, oldAwardId.toString(), -1);//更新替换操作,替换商品总投放量加一jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, awardId.toString(), 1);}jedis.hset(Rkey.TURNTALE_NEXT_AWARD, userId.toString(), awardId.toString());//数据库} else {throw new BusiException(E.CUSTOM_ERROR_MSG, "用户不存在");}} finally {RedisPool.returnJedis(jedis);}
}

抽取之后,代码如下:

public void updateTurntableNextAward(Integer userId, Integer awardId, HttpServletRequest request) {//验证奖品BsTurntableAward award = turntableAwardMapper.selectByPrimaryKey(awardId);if (award == null) {throw new BusiException(E.INVALID_PARAMETER, "奖品不存在");}if (award.getState() != 1) {throw new BusiException(E.INVALID_PARAMETER, "奖品已停售");}Jedis jedis = RedisPool.getJedis();SysUser sysUser = (SysUser) request.getSession().getAttribute(R.LOGIN_USER);try {if (jedis.hexists(Rkey.USER_INFO, userId.toString())) {String hget = jedis.hget(Rkey.TURNTALE_NEXT_AWARD, userId.toString());if (StringUtils.isEmpty(hget)) {//第一次设置BsTurntableNextAward record = new BsTurntableNextAward();record.setAwardId(awardId);record.setState(0);record.setUserId(userId);record.setSysUser(sysUser.getUserName());turntableNextAwardMapper.insert(record);//修改必中商品的已抽取库存总量:extractAmount + 1turntableAwardMapper.updateExtractAmountAddOneByAwardId(awardId);//新增操作,redis 对应商品总投放量加一jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, awardId.toString(), 1);//操作数据库 商品对应投放库存加一//下面这部分可以抽取为1个方法,选中这部分,按下快捷键 Ctrl + Alt + M,填写方法名称即可抽取updateAmountAddOneWhenSettingBizhong(awardId);} else {//替换操作Integer oldAwardId = Integer.valueOf(hget);// 查询用户是否有 没有抽取的必中记录BsTurntableNextAward record = turntableNextAwardMapper.queryDataByUserAndState(userId, 0);if (record != null) {record.setAwardId(awardId);record.setSysUser(sysUser.getUserName());turntableNextAwardMapper.updateByPrimaryKeySelective(record);//修改之前设置的必中商品已抽取库存总量:extractAmount - 1turntableAwardMapper.updateExtractAmountReduceOneByAwardId(oldAwardId);//修改必中商品的已抽取库存总量:extractAmount + 1turntableAwardMapper.updateExtractAmountAddOneByAwardId(awardId);}//更新替换操作,原有商品总投放量减一jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, oldAwardId.toString(), -1);//更新替换操作,替换商品总投放量加一jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, awardId.toString(), 1);}jedis.hset(Rkey.TURNTALE_NEXT_AWARD, userId.toString(), awardId.toString());//数据库} else {throw new BusiException(E.CUSTOM_ERROR_MSG, "用户不存在");}} finally {RedisPool.returnJedis(jedis);}
}// 操作数据库 设置必中 对应商品库存加一
private void updateAmountAddOneWhenSettingBizhong(Integer awardId) {Date now = new Date();String formatDate = DateUtil.formatDate(now, "yyyy-MM-dd HH:mm");BsTurntableActivity nowPeriodActivity = turntableActivityMapper.queryNowPeriodActivity(formatDate);String curActivityId = nowPeriodActivity.getId().toString();BsTurntableActivity turntableActivity = new BsTurntableActivity();turntableActivity.setId(curActivityId);if (nowPeriodActivity.getAwardId1().equals(awardId)) {turntableActivity.setAmount1(nowPeriodActivity.getAmount1() + 1);} else if (nowPeriodActivity.getAwardId2().equals(awardId)) {turntableActivity.setAmount2(nowPeriodActivity.getAmount2() + 1);} else if (nowPeriodActivity.getAwardId3().equals(awardId)) {turntableActivity.setAmount3(nowPeriodActivity.getAmount3() + 1);} else if (nowPeriodActivity.getAwardId4().equals(awardId)) {turntableActivity.setAmount4(nowPeriodActivity.getAmount4() + 1);} else if (nowPeriodActivity.getAwardId5().equals(awardId)) {turntableActivity.setAmount5(nowPeriodActivity.getAmount5() + 1);} else if (nowPeriodActivity.getAwardId6().equals(awardId)) {turntableActivity.setAmount6(nowPeriodActivity.getAmount6() + 1);}turntableActivityMapper.updateByPrimaryKeySelective(turntableActivity);
}

ps:
1.选中要提取的部分,按下快捷键 Ctrl + Alt + M,填写方法名称即可抽取
2.有可能提取的时候,提取的参数不够(不满足我们的期望),可以等提取结束后手动修改,加入需要的参数。

idea 将代码块抽取为方法 快捷键相关推荐

  1. IDEA中将代码块封装为方法,IDEA代码重构快捷键

    IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:

  2. java 静态代码块有什么用,java编程开发静态代码块的使用方法都有哪些

    代码块是程序员在学习java编程开发的时候会接触到的一个代码,而今天我们就通过案例分析来了解一下,java编程开发静态代码块的使用方法都有哪些. (一)java静态代码块静态方法区别 一般情况下,如果 ...

  3. idea抽取重复方法快捷键_使用 IDEA 几分钟就重构了同事800 行quot;又臭又长quot; 的类!真香!...

    最近在对已有项目进行扩展的时候,发现要改动的一个类它长 766 行,开放了近 40 个 public 接口,我流着泪把它给改完了.为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程 ...

  4. idea抽取重复方法快捷键_IDEA 真牛逼,900行 quot;又臭又长quot; 的类重构,几分钟搞定...

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:网传互联网公司加班表 个人原创+1博客:点击前往,查看更多 作者:橙味菌链接:https://juejin.im ...

  5. java静态变量、静态方法、代码块、main方法

    文章目录 一.类变量 / 静态变量(static) 二.类方法 / 静态方法(static) 三.main方法 四.代码块 (一)static代码块 (二)普通代码块 五.属性初始化.代码块.构造器的 ...

  6. VSCode 代码块/全文 折叠/展开 快捷键

    需求 && 操作 常用的两类场景(注意要操作的范围): 要操作光标所在文件中的所有代码块: 折叠所有 Ctrl+K+0 展开所有 Ctrl+K+J 仅仅操作光标所处代码块内的代码: 折 ...

  7. IDEA代码抽取为方法快捷键

    Ctrl + Alt + m

  8. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上/下造型,main方法,抽象类,接口,设计模式,异常,内部类

    1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...

  9. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上_下造型,main方法,抽象类,接口,设计模式,异常,内部类

    1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...

最新文章

  1. 利用属性封装复杂的选项
  2. 灵动MM32 MCU助力全国大学生智能汽车竞赛
  3. 总结:Sharepoint2010 Client Object Model -- Silverlight Client
  4. 大学计算机python期末考试用什么软件_大学计算机--Python算法实践_章节测验,期末考试,慕课答案查询公众号...
  5. cie规定的标准光源_什么是标准光源?
  6. macOS的Fn键实用技巧分享
  7. Java中--XX和XX的区别
  8. python语言三角函数_python中三角函数_Python中的三角函数
  9. 计算机关机后耗电问题,笔记本关机后耗电严重?Win10笔记本关机还耗电解决办法...
  10. Linux下sz下载文件超过4G办法
  11. 高通Hexagon通用计算DSP介绍
  12. 在VirtualBox安装Ubuntu虚拟机实现文件夹共享
  13. CycleGAN的测试
  14. 数据可视化之美+点、线、面组合(以Python为工具)
  15. struct的基本使用-go篇
  16. python中mod函数用法_python divmod函数是如何使用的?
  17. Linux 系统日常运维九大技能和运维网络知识总结
  18. Linux下使用游戏手柄
  19. 深度学习word2vec笔记之基础篇
  20. HBase中RegionServer宕机恢复介绍

热门文章

  1. 应用程序无法正常启动, 错误代码0xc0000007b
  2. mfc 能结合oracle吗,MFC通过ADO连接Oracle数据库 | 学步园
  3. html中籍贯怎么写,户口本上的籍贯是什么意思 籍贯怎么填才正确
  4. QT制作360悬浮球
  5. android 360 悬浮窗,360手机卫士悬浮窗显示与隐藏方法
  6. 为什么这么多人说 IDEA 比 Eclipse 更好?
  7. 年底了,怎么和领导提加薪?
  8. python爬小说代码_中文编程,用python编写小说网站爬虫
  9. 深入场景,产融智合驱动金融业务智慧升级
  10. 动态多目标进化优化研究进展