Java程序员必备奇淫巧技篇(上)

【机器学习与数据挖掘实战 | 商务】案例03:基于k近邻算法的非侵入式电力负荷监测与分解的电力分析 本案例结合非侵入式电力负荷监测与分解的案例,重点介绍了在数据可视化的辅助下k近邻算法的应用。首先利用数据可视化寻找数据的特征,构建特征集合。然后构建k近邻模型,利用构建的特征集合训练模型,接着利用该模型对单一设备所属类别进行判定,最后计算实时用电量。 阅读详情

前言

前面我们讲了Java编程过程中的命名和注释、代码风格,今天我们来讲一些比较实用的Java编程技巧,帮你切实地提高代码可读性。这部分技巧比较琐碎,也很难罗列全面,我仅仅总结了一些我认为比较关键的,更多的技巧需要你在实践中自己慢慢总结、积累。

1. 把代码分割成更小的单元块

大部分人阅读代码的习惯都是,先看整体再看细节。所以,我们要有模块化和抽象思维,善于将大块的复杂逻辑提炼成类或者函数,屏蔽掉细节,让阅读代码的人不至于迷失在细节中,这样能极大地提高代码的可读性。不过,只有代码逻辑比较复杂的时候,我们其实才建议提炼类或者函数。毕竟如果提炼出的函数只包含两三行代码,在阅读代码的时候,还得跳过去看一下,这样反倒增加了阅读成本。

这里我举一个例子来进一步解释一下。代码具体如下所示。重构前,在 invest () 函数中,最开始的那段关于时间处理的代码,是不是很难看懂?重构之后,我们将这部分逻辑抽象成一个函数,并且命名为 isLastDayOfMonth,从名字就能清晰地了解它的功能,判断今天是不是当月的最后一天。这里,我们就是通过将复杂的逻辑代码提炼成函数,大大提高了代码的可读性。

// 重构前的代码

public void invest(long userId, long financialProductId) {

  Calendar calendar = Calendar.getInstance();

  calendar.setTime(date);

  calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));

  if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {

​    return;

  }

  //...

}

// 重构后的代码:提炼函数之后逻辑更加清晰

public void invest(long userId, long financialProductId) {

  if (isLastDayOfMonth(new Date())) {

​    return;

  }

  //...

}

public boolean isLastDayOfMonth(Date date) {

  Calendar calendar = Calendar.getInstance();

  calendar.setTime(date);

  calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));

  if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {

   return true;

  }

  return false;

}

2. 避免函数参数过多

我个人觉得,函数包含 3、4 个参数的时候还是能接受的,大于等于 5 个的时候,我们就觉得参数有点过多了,会影响到代码的可读性,使用起来也不方便。针对参数过多的情况,一般有 2 种处理方法。

考虑函数是否职责单一,是否能通过拆分成多个函数的方式来减少参数。示例代码如下所示:

public void getUser(String username, String telephone, String email);

// 拆分成多个函数

public void getUserByUsername(String username);

public void getUserByTelephone(String telephone);

public void getUserByEmail(String email);

将函数的参数封装成对象。示例代码如下所示:


// 将参数封装成对象

public class Blog {

title: 33-改善代码质量的20条编程规范

  private String summary;

  private String keywords;

  private Strint content;

  private String category;

  private long authorId;

}

public void postBlog(Blog blog);

除此之外,如果函数是对外暴露的远程接口,将参数封装成对象,还可以提高接口的兼容性。在往接口中添加新的参数的时候,老的远程接口调用者有可能就不需要修改代码来兼容新的接口了。

3. 勿用函数参数来控制逻辑

不要在函数中使用布尔类型的标识参数来控制内部逻辑,true 的时候走这块逻辑,false 的时候走另一块逻辑。这明显违背了单一职责原则和接口隔离原则。我建议将其拆成两个函数,可读性上也要更好。我举个例子来说明一下。

public void buyCourse(long userId, long courseId, boolean isVip);

// 将其拆分成两个函数

public void buyCourse(long userId, long courseId);

public void buyCourseForVip(long userId, long courseId);

不过,如果函数是 private 私有函数,影响范围有限,或者拆分之后的两个函数经常同时被调用,我们可以酌情考虑保留标识参数。示例代码如下所示:

// 拆分成两个函数的调用方式

boolean isVip = false;

//... 省略其他逻辑...

if (isVip) {

  buyCourseForVip(userId, courseId);

} else {

  buyCourse(userId, courseId);

}

// 保留标识参数的调用方式更加简洁

boolean isVip = false;

//... 省略其他逻辑...

buyCourse(userId, courseId, isVip);

除了布尔类型作为标识参数来控制逻辑的情况外,还有一种 “根据参数是否为 null” 来控制逻辑的情况。针对这种情况,我们也应该将其拆分成多个函数。拆分之后的函数职责更明确,不容易用错。具体代码示例如下所示:

public List<Transaction> selectTransactions(Long userId, Date startDate, Date endDate) {

  if (startDate != null && endDate != null) {

​    // 查询两个时间区间的 transactions

  }

  if (startDate != null && endDate == null) {

​    // 查询 startDate 之后的所有 transactions

  }

  if (startDate == null && endDate != null) {

​    // 查询 endDate 之前的所有 transactions

  }

  if (startDate == null && endDate == null) {

​    // 查询所有的 transactions

  }

}

// 拆分成多个 public 函数,更加清晰、易用

public List<Transaction> selectTransactionsBetween(Long userId, Date startDate, Date endDate) {

  return selectTransactions(userId, startDate, endDate);

}

public List<Transaction> selectTransactionsStartWith(Long userId, Date startDate) {

  return selectTransactions(userId, startDate, null);

}

public List<Transaction> selectTransactionsEndWith(Long userId, Date endDate) {

  return selectTransactions(userId, null, endDate);

}

public List<Transaction> selectAllTransactions(Long userId) {

  return selectTransactions(userId, null, null);

}

private List<Transaction> selectTransactions(Long userId, Date startDate, Date endDate) {

  // ...

}

更多原创阅读:https://javawu.com

手把手教你学AI GPU的UMD驱动软件开发专栏简介 通过本专栏的学习,您将掌握UMD的核心概念、开发环境搭建、API实现、内存管理和同步技术,以及在实际AI场景中的应用。通过本专栏的学习,您将不仅掌握UMD驱动开发的核心技术,还将能够将这些技术应用到实际的AI应用场景中,为您的AI应用提供更高效的硬件加速支持。无论您是想开发自己的AI加速框架,还是希望深入理解现有AI加速库的工作原理,本专栏都将为您提供宝贵的知识和实践经验。:本专栏不仅讲解UMD驱动的核心概念,还通过精心设计的实战案例,引导您从零开始构建UMD驱动,真正掌握AI GPU驱动开发的技能。 阅读详情

相关推荐

OpenClaw + Qwen 模型集成飞书完整教程

1、环境要求:- **操作系统**: Windows- **Node.js**: v18+ (推荐 v20+)- **飞书账号**: 需要企业管理员权限(创建应用用)或者个人飞书账号创建个人应用- **网络**: 能访问 GitHub 和飞书开放平台2、安装Node.js下载完成后验证是否安装成功,cmd窗口输入“node --version”,显示版本号即为安装成功(如下图所示)3、获取大模型APIKEY(这里以Qwen为例)

qq_29609427的博客 478

教你几个 Java 中的奇技淫巧

枯燥的编程中总得有些乐趣,今天我们不谈论那些高深的技能,教你几个在编程中的奇技淫巧,说不定在某些时候还能炫耀一番呢。 1.找到最大值和最小值 不使用 if else switch 和三元运算符,在给定的三元组中找到最大值和最小值:比如给定 3,14,8,在不使用 if else switch 和三元运算符的情况下找到最大值和最小值。 话不多说,我们先看代码: public static int findMax(int a, int b, int c) { int max = a;

weixin_68320784的博客 905

OTN传送网实战指南:从光层到电层的完整架构解析(附配置示例)

本文深入解析OTN传送网从光层到电层的完整架构,涵盖关键组件、技术实现及配置示例。通过高速公路与光传送网的类比,详细介绍了光层超宽传输管道构建、电层业务调度核心引擎以及控制平面智能运维实战。附有典型组网方案与故障排查指南,助力网络工程师高效部署与维护OTN传送网。

tomato的博客 684

Java中的一些奇淫技巧总结

不用中间变量交换两个数public class SWapTest { static int a = Integer.MAX_VALUE; static int b = 1; public static void main(String[] args) { System.out.println("初始值,a = " + a + ",b = " + b);

梦醒,已千年的专栏 3269

JWT实战:5分钟搞定Spring Boot集成JWT认证(含完整代码示例)

本文详细介绍了如何在Spring Boot中快速集成JWT认证,提供完整的代码示例和配置指南。通过JWT实现无状态认证,解决分布式系统中的会话管理问题,提升系统扩展性和安全性。涵盖令牌生成、验证、Spring Security整合及生产级优化方案。

weixin_29327525的博客 456

手把手教你用运放和基准源,把±10V信号变成ADC能吃的0-4V(附完整计算过程)

本文详细介绍了如何利用OP07运放和REF5040基准源设计工业级信号调理电路,将±10V传感器信号转换为0-4V ADC可接受范围。通过七步流程,包括需求分析、元器件选型、电路设计、理论计算、PCB布局、实测验证与性能优化,帮助工程师解决信号不匹配问题,提升系统精度与稳定性。

weixin_28731223的博客 468

Java奇技淫巧:new对象后加大括号{},最后顺便做了个小框架?

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!” />这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!![外链图片转存中…(img-BYaqgXIT-1713137443676)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

2301_82242844的博客 1098

手眼标定(EyeToHand)推导

Base为基坐标系(B),工具末端坐标系(T),标定板为Mark坐标系(M),相机坐标系(C)对于每两个姿态都存在上式,组成一个AX=XB的矩阵方程,X为。此时转换成AX=0的问题,单纯用SVD求奇异解便可得到。相机坐标系到Base基坐标系下的转换关系。已知标定板与机械臂末端的相对位置固定不变,,即。带入(2)式求,至此求解出需要的手眼矩阵。在眼在手外的时候,其实是要求解。

stevenreally6的博客 1143

CodeForces 721A One-dimensional Japanese Crossword(第三场)

,,,

Shyazhut 2707

SAP 批次管理

批次管理: 业务场景: 批次常用于:采购、生产、SD等: 1、先进先出,先入库的先出库(如何实现),基于入库时间来自动确定出库策略。 2、追塑:基于批次进行产品质量追溯 例如订单MTO ---> PP ----> MM(批次关联)。SO—>PP工单 --> 预留 --> 发料(基于批次A\B\C)-->产成品入库-->批次入库D--> ...

willieyuan的博客 1万+

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

共轭梯度法的核心原理是求解优化问题的共轭向量组作为优化方向,由于优化方向间彼此正交,故每次迭代只需沿着一个方向寻优而互不影响。本文设计基于ESDF的障碍约束、曲率约束和平滑约束,基于ROS C++和Python提供了共轭梯度法的轨迹优化实践案例

FRIGIDWINTER的博客 1万+

java mutable 包装类_【奇技淫巧】巧用 kotlin 扩展函数和 typealias 封装 带网络状态和解决「粘性」事件的 LiveData...

关于 LiveData 两个常用的姿势使用包装类传递事件我们在使用 LiveData 时可能会遇到「粘性」事件的问题,该问题可以使用包装类的方式解决。解决方案见 [译] 在 SnackBar,Navigation 和其他事件中使用 LiveData(SingleLiveEvent 案例)使用时是这样的class ListViewModel : ViewModel {private val _nav...

weixin_34509784的博客 320

深入解析雪球网股票行情数据爬取:基于WebSocket与API的实时数据获取技术实践

本文详细介绍了如何使用Python爬虫技术获取雪球网的股票行情数据,涵盖了WebSocket实时数据连接和RESTful API接口调用两种主要技术方案。完整的WebSocket客户端,支持实时行情订阅和数据处理功能丰富的API客户端,支持多种数据类型的获取数据存储和管理系统,使用SQLite进行数据持久化实时监控和预警系统,支持自定义预警规则技术指标计算,提供基本的数据分析功能。

2201_76125261的博客 1256

10 个 GitHub 上最火的程序员简历项目,2021 金三银四必备!

大家好,我是你们的 猫哥,一个不喜欢吃鱼、又不喜欢喵 的超级猫 ~前言猫哥是一个常年混迹在 GitHub 上的猫星人,所以发现了不少好的前端开源项目、常用技巧,在此分享给大家。公众号:前端...

前端GitHub 1660

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

程序员必备 VS Code 插件大全!

工欲善其事,必先利其器!VS Code 就像经典游戏《上古卷轴5:天际》一样,本体已经足够强了,但如果你装上各种奇技淫巧的 mod(插件),你能收获完全不一样的游戏(开发)体验。——介系你没有玩过的船新版本!本篇文章,我们精选了鹅厂程序员强推的 VS Code 插件大全,帮助你在写代码的路上一路狂飙,效能翻倍!01Code Runner最好的软件开发往往来自于程序员的直接需求,Code Runne...

weixin_45583158的博客 276

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

月薪30K+:程序员必备成长宝典

技能提升之路漫漫想快速get技能成为优秀的程序员吗?送你一批IT编程干货公众号不仅包含了技术干货分享、求职面试技术分享创业经验分享等…还有大批IT资源相送。  码个蛋ID:codeegg▲长按图片识别二维码关注关注「码个蛋」,每天早上7:00准时推送,Android技术、程序员成长之路在这都有,替您从海量同类文章中筛选出高质量文章,为您提供最快捷的精进之路。 iOS开发ID:iOSDevTip▲长

iOS_开发 1797

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

10 个 GitHub 上最火的程序员简历项目,2021 金三银四必备的加薪宝剑!

前言 已经推荐了 面试项目、css 奇技淫巧项目、代码规范项目、数据结构与算法项目、JavaScript 奇技淫巧项目、前端必备在线工具 等专题的近 100 个优秀项目了。 平时如何发现好的开源项目,可以看看这篇文章:GitHub 上能挖矿的神仙技巧 - 如何发现优秀开源项目 1. ResumeSample 程序员简历模板系列。 包括 PHP 程序员简历模板、iOS 程序员简历模板、Android 程序员简历模板、Web 前端程序员简历模板、Java 程序员简历模板、C/C++ 程序员简历模板、Nod

AndroidAlvin的博客 2281

android开发奇技淫巧《通过main方法,写单元测试》

阅读完这篇blog大概需要3分钟。 假如我们在android项目里写一个java的main方法会怎么样? 这是一个有趣的问题,并且会让你惊喜。 如下代码段: import android.app.Activity; import android.os.Bundle; import androidx.annotation.Nullable; import java.util.Arrays...

IT互联网大叔的专栏 3297

最新Java奇技淫巧:new对象后加大括号{},最后顺便做了个小框架?,别再说自己不会了

切莫死记硬背,小心面试官直接让你出门右拐1000道互联网Java面试题:

pCITv1C的博客 782

涨姿势了!22 个拓展程序员技术与视野的国外网站,快添加进收藏夹!

大家好,我是你们的 猫哥,一个不喜欢吃鱼、又不喜欢喵 的超级猫 ~关于猫哥,大家可以看看我的年终总结 前端工程师的 2020 年终总结 - 乾坤未定,你我皆黑马。前言初级前端与高级前端之间...

前端GitHub 663

通过JUnit源码分析学习编程的奇技淫巧

合集 - 威哥爱编程(17)1.35个Redis企业级性能优化点与解决方案06-252.对比传统数据库,TiDB 强在哪?谈谈 TiDB 的适应场景和产品能力06-253.深度长文解析SpringWebFlux响应式框架15个核心组件源码07-044.Nginx性能调优5招35式不可不知的策略实战07-085.Java Executors类的9种创建线程池的方法及应用场景分析07-096.Redi...

weixin_42027290的博客 335

630页!熬夜整理出的“高分宝典“:算法+数据结构+网络+操作系统

分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,因此我们需要不断去审视自己,通过学习来让自己得到相应的提升。 近段时间,我也了解到很多小伙伴不清楚作为Java程序员应该掌握什么样的核心知识?实际上,那些老生常谈的Spring、Redis我也就不再去重复了。所以花了一个星期,整理了这份630页的"高分宝典",主要涉及算法、数据结构、网络、操作系统等几个部分,以及我个人的一些面试经历,希望能够对大家提升自己有所帮

javassb的博客 1247

阿里P8大牛手写: Linux+网络编程 手册,搞到手之后面试简直如虎添翼

可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。

2401_84584552的博客 903

技术人必备的碎片化时间学习神器

工作、生活节奏超快的今天,想要不断提升自我,碎片化阅读学习是你最佳的选择,如果你有一颗学习的心,那这些学习型的公众号,绝对会让你受益匪浅。小编为你精选了技术领域几个精品微信订阅号,涵盖了时下最热门的技术领域,还有行业内的热点新闻和干货教程推送。同时,你还能加入这些公众号的学习社群,和各个领域的大咖面对面交流,不断学习,提升自我!!想要学到更多,什么时候开始都不晚!赶紧加入吧!程序员共读最有影响力的

非著名程序员 992

这些 Windows 上的奇技淫巧让你逼格、效率倍增

不用借助任何第三方软件,其实 Windows 也大有可为——比你目前了解得至少要多得多,这些技能就在这个帖子下面一个一个 get 起来吧~1、隐藏文件谁的电脑里没点小秘密...

实验楼 539

10 个 GitHub 上最火的程序员简历项目,2021 要跳槽的先收藏了!

大家好,我是你们的 猫哥,一个不喜欢吃鱼、又不喜欢喵 的超级猫 ~前言猫哥是一个常年混迹在 GitHub 上的猫星人,所以发现了不少好的前端开源项目、常用技巧,在此分享给大家。公众号:前...

全栈修炼 1564
上一篇: 使用Spring Data JPA 访问 Mysql 数据库-配置项
下一篇: 如何优雅的实现Mysql 增删改查,看完你就会了
大盛玩java
博客等级 码龄5年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值