(一)改掉这些坏习惯,还怕写不出健壮的代码?

优化 Java 代码中的 equals() 方法:避免将其作为调用方而非参数的最佳实践 在软件开发中,Java 中的 equals() 方法扮演着比较对象内容的重要角色。然而,在条件语句中,不正确使用它可能导致空指针异常和代码复杂性。本文将深入探讨如何优化代码,避免将 equals() 方法作为调用方,而不是参数的常见问题。我们将分析问题根源并提供解决方案,讨论实际场景应用以及最佳实践,以帮助您编写更可靠、简洁和高效的 Java 代码。 阅读详情

Code Review 是一场苦涩但有意思的修行。

近期对团队负责的项目,进行了一次 Code Review,代码评审过程中遇到的那些编码坏习惯,笑的合不拢嘴。不过,评审中很多代码编写问题,以往都多次提及过,所以气还是不打一处来。

作为用代码编写人生的程序员,能拥有写一手健壮代码的本领,那绝对很有必要。因为健壮的代码能够把 Bug 扼杀在摇篮里,能够让问题止步于上线前。

那么,怎样才能练就写出健壮代码的本领呢?

本次着重谈谈那些代码编写时的一些坏习惯,改掉这些坏习惯,相信会向健壮代码迈进一大步。

1. 编码时易忽略性能的坏习惯 

坏习惯一:调用低效的构造器,创建包装类型的对象。

反例:正解:解惑:使用 Long.valueOf(long) 代替 new Long(long),可以提高性能。如 Long 源码所示,如果当传入的值介于 -128~127 时,会优先从缓存中返回缓存的值,而不是进行 new,充分利用空间换取时间,所以当值介于 -128~127 时,采取 Long.valueOf(long) 的效率要比 new Long(long) 快很多。

建议:

a)凡是涉及到 Long, Integer, Short, Character 以及 Byte 创建对象时,优先采用高效的 valueOf() 方法,而不是直接用低效构造器创建实例。

b)享元设计模式在这儿用到了,什么是享元模式?(留个作业)

坏习惯二:使用 keySet 迭代器迭代 Map,获取对应的 value。

反例:

正解:

解惑:keySet 方式遍历 Map 的性能不如 entrySet 性能好。

如果采用 keySet 的方式获取 Map 中 key,然后通过 key 获取 Map 对应的 value,如上图 HashMap 源码所示,每次都需要通过 key 去计算对应的 hash 值,然后再通过 hash 值获取对应的 value,效率会低不少。

建议:

a)如果想获取 Map 对应的 key 和 value,则推荐使用 entrySet。

b)如果只是单纯获取 Map 对应的 key,则推荐使用 keySet。

坏习惯三:使用 new Date().getTime() 获取当前时间戳。

反例:正解:解惑:如下图 Date 源码所示,Date 构造方法中最终还是调用了 System.currentTimeMillis() 方法来获取时间戳。建议:

a)获取当前毫秒数采用 System.currentTimeMillis(),而不是new Date().getTime(); 

b)获取更加精确的纳秒级时间值,采用 System.nanoTime;

c)在 JDK8 中,针对统计时间等场景,建议使用 Instant 类。

坏习惯四:循环中使用 ”+“ 号拼接字符串。

反例:

正解:推荐使用 StringBuilder/StringBuffer 进行字符串拼接。

解惑:「Java 程序该怎么优化?技巧篇」以前的这篇分享做过试验,本次不赘述。

2. 编码时易犯的一些小毛病 

毛病一:变量作为 equals() 方法的调用方。

反例:

正解:

解惑:totalCount 应该作为方法  equals() 的调用方,而不是参数 作为调用方,因为参数作为调用方会出现空指针异常。

建议:

a)字符串的比较,常量建议当做 equals() 方法的调用方;

b)字符串判断空,建议用项目中的工具类。

毛病二:对象为 null 的检查滞后。

反例1:

正解:请在使用 data 对象前,做好是否为 null 的判断。

反例2:

正解:请提前检查对象 fos、fis 是否为 null,应该在第一次使用前就做空值检查。

解惑:后置对象为空的检查,可能会导致空指针异常的发生。

毛病三:要求传入非空的方法,传入空值。

反例:

正解:signInfo 变量的值可能存在为空的情形,导致发生空指针异常。

建议:发生异常的时候,方法该终止就终止;尽量做好防御性编程,该校验的参数进行必要的校验。

3. 寄语写最后 

常在河边站哪有不湿鞋,再牛逼的码农,编码也会有失误的时候,很有必要借助一款代码检查工具,做最后一道防线。

在这里,推荐 FindBugs、Checkstyle、SonarQube 三款代码检查工具,不过我用的最多的当属 FindBugs,可以拿去一试,使用门槛几乎为零。

好了,编码中易犯的那些臭毛病,本次就谈到这里,不知道有多少条是触动了你的心弦,希望有则改之。

一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!

推荐阅读:

真实|技术人员该如何站好最后一班岗?

Amber实战:小分子配体MD模拟全流程避坑指南(附磷酸基团处理技巧) 本文提供了一份基于Amber软件进行小分子配体分子动力学模拟的实战避坑指南。详细解析了从晶体结构预处理、配体参数化(重点探讨AM1-BCC与RESP电荷选择)、复合物体系构建到模拟稳定性调试的全流程。特别针对磷酸基团等特殊官能团处理中常见的模拟崩溃问题,给出了系统性的诊断与解决方案,旨在帮助研究者获得稳定可靠的模拟结果。 阅读详情

相关推荐

PIDNet实战:如何在Cityscapes数据集上实现93.2 FPS的实时语义分割(附完整训练代码)

本文提供了在Cityscapes数据集上实现实时语义分割模型PIDNet的完整工程实践指南。PIDNet凭借其独特的比例-积分-微分三分支架构,在CVPR 2023上取得了速度与精度的出色平衡。文章详细介绍了从环境配置、数据预处理、模型训练到性能优化与部署的全流程,并分享了实现93.2 FPS高推理速度的关键技巧与代码。

weixin_29047919的博客 374

用.Equals() 函数时,如果调用的可能为空,而参数不会为空,可以两者互换避免报错!

a.Equals(b)   b.Equals(a)

new Girl的博客 3289

飞腾D2000开发板实战:手把手教你为UEFI/EDK2驱动SD3077 RTC时钟芯片

本文详细介绍了在飞腾D2000开发板上为UEFI/EDK2环境驱动SD3077 RTC时钟芯片的全流程开发指南。从硬件连接到软件适配,包括引脚复用配置、电源管理优化以及UEFI驱动的深度定制,帮助开发者解决嵌入式系统中的时间同步问题,确保RTC芯片的稳定性和准确性。

weixin_30892037的博客 423

java复习---基础

java面试复习—基础 1.面向对象和面向过程的区别 面向过程:性能较高。面向过程语言大多是可以直接编译成机械码,直接就能在电脑上运行;而面向过程语言在运行时需要进行类的实例化,开销大并且消耗资源;而对于Java语言的性能较差问题,主要原因是它属于半编译语言,最终的执行代码不是可以直接被CPU执行的二进制机械码。 面向对象:易维护,易复用,易拓展。这些优点完全建立在面向对象语言的三大特性之上的,...

suvue 2532

Mann-Kendall检验全解析:从原理到11种变体及Python实现

本文全面解析Mann-Kendall检验,从基础原理到应对自相关、季节性等复杂数据的11种关键变体,如Hamed-Rao修正、季节性MK和趋势自由预白化(TFPW)。详细阐述各方法的适用场景与数学原理,并提供完整的Python实战代码,帮助研究者针对不同数据特性选择最稳健的趋势分析方法。

weixin_29050271的博客 458

13、Java 中 MQTT 异步通知与回调的使用及传感器命令处理

本文详细介绍了在 Java 中使用 MQTT 的异步通知与回调机制,并展示了如何通过 Paho Java 客户端处理与传感器交互的命令。文章包含代码示例,讲解了 MQTT 客户端的连接、订阅、消息处理以及模拟传感器数据发布的过程,适用于希望在 Java 应用中实现 MQTT 通信与设备控制的开发者。

eee77的博客 159

Java面试题

<br />1、 概述struts,以及struts如何实现MVC架构的? <br />答:struts framework是一种基于java的技术,Web应用程序开发人员通过struts framework即可充分利用面向对象设计、代码重用以及"编写一次、到处运行"的优点。Struts提供了一种创建Web应用程序的框架,其中对应用程序的显示、表示和数据的后端代码进行了抽象。Struts采用jsp作为MVC的视图,由ActionServlet具体指定的action动作类作为控制器即MVC中的C,负责视图与模

uiop_7890_7890的专栏 534

LeRobot 入门教程(五)异步推理

本文介绍了基于SmolVLA的异步推理技术在机器人控制中的应用。通过将动作预测与执行解耦,异步推理消除了传统同步推理中的等待延迟,使机器人行为更加流畅。文章详细讲解了如何安装依赖、启动策略服务器和机器人客户端,并重点说明了关键参数actions_per_chunk和chunk_size_threshold的调整方法。实验表明,异步推理能显著提升机器人响应速度,特别适合大规模模型应用。最后,文章建议用户根据具体硬件和任务需求优化参数配置,以获得最佳性能。

2506_90492529的博客 1643

你真的了解 equals 方法吗?

Java equals 方法 和 hashCode方法详解

若尘的博客 1748

【图像去噪】基于加权核范数最小化算法实现图像去噪附matlab代码

1 简介 WNNM是一种约束矩阵奇异值稀疏性的低秩算法,在NNM理论基础上增加了核范数权重,有效利用了自然图像的先验信息并提高了核范数的灵活性. 2 部分代码 ​clcclear allclose allnSig = 100;O_Img = double(imread('Monarch.png'));​randn('seed', 0);N_Img = O_Img + nSig* randn(size(O_Img)); ..

qq_59747472的博客 3114

智能体异常行为检测-基于行为序列的异常模式识别技术【附代码】

在多智能体系统(Multi-Agent Systems, MAS)中,智能体之间的行为协调与自主决策是系统稳定运行的关键。然而,当某个智能体因策略偏移、环境变化或潜在攻击而出现**异常行为(Abnormal Behavior)**时,整个系统可能陷入混乱或崩溃。

一键难忘的博客 1143

(四)改掉这些坏习惯,还怕写不出健壮的代码?

Code Review 是一场苦涩但有意思的修行。(一)改掉这些坏习惯,还怕写不出健壮的代码?(二)改掉这些坏习惯,还怕写不出优雅的代码?(三)改掉这些坏习惯,还怕写不出优雅的代码?书接...

一猿小讲 1930

【Unity动画优化插件】BT - OptiAnimX —— AAA级动画优化框架深度剖析

BT - OptiAnimX 是一款面向 Unity 的高性能动画优化框架,核心目标是解决多角色动画场景中的性能瓶颈问题。该插件对标《战争机器5》和《巫师3》等 AAA 游戏中的动画优化技术,通过一整套自动化与智能化的优化策略,将动画性能提升与视觉质量控制结合在一起。它适用于从移动端、VR 到高端 PC 的多平台项目,尤其在“多人角色 + 高频动画”的场景中表现突出,例如 MMO、开放世界、动作游戏等。BT - OptiAnimX 本质上是一套“动画性能调度系统”,而不仅仅是优化工具。

2403_88403568的博客 433

(六)改掉这些坏习惯,还怕写不出精简的代码?

鲁迅说:嬉笑怒骂里充满了无奈和妥协。小猿说:先生说的不对,在程序员的世界里,编写代码处处充满了无奈和妥协。(一)改掉这些坏习惯,还怕写不出健壮的代码?(二)改掉这些坏习惯,还怕写不出优...

一猿小讲 1850

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

(二)改掉这些坏习惯,还怕写不出优雅的代码?

Code Review 是一场苦涩但有意思的修行。上期分享,通过示例剖析编码中一些经常触犯的性能点,以及编码时常犯的一些小毛病,来告诉新手程序员如何写出健壮的代码。咱们书接上篇,本次一起...

一猿小讲 1625

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

前端写TypeScript的时候必须改掉的 16 个坏习惯

​:用 JSDoc 或 TSDoc 描述复杂逻辑。​:显式声明返回值类型,便于维护和文档化。​:假设 API 返回的数据符合预期。​:用注释掩盖问题,而非修复类型错误。​:优先解决类型问题,或使用更安全的。​:依赖类型推断,函数返回值不明确。​:直接使用字符串/数字,难以维护。​:将类型抽离到单独文件(如。​:手动维护类型与值的同步。​:类型定义与业务代码混杂。​:代码缺乏文档,难以理解。​:使用类型守卫或库(如。​:用泛型抽象通用逻辑。​:未穷举所有条件分支。​:用枚举或常量替代。

W11929311582的博客 586

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

(五)改掉这些坏习惯,还怕写不出精简的代码?

鲁迅说:嬉笑怒骂里充满了无奈和妥协。小猿说:先生说的不对,在程序员的世界里,编写代码处处充满了无奈和妥协。Code Review 是一场苦涩但有意思的修行。(一)改掉这些坏习惯,还怕写...

一猿小讲 1976

(三)改掉这些坏习惯,还怕写不出优雅的代码?

Code Review 是一场苦涩但有意思的修行。书接上篇,本次一起继续探讨一下,该如何写出优雅的代码?1编码时:搞的复杂并不好坏习惯一:多余的 if/else。反例:类似上面这种写...

一猿小讲 2036

改掉这些坏习惯,还怕写不出精简的代码

鲁迅说:嬉笑怒骂里充满了无奈和妥协。 小猿说:先生说的不对,在程序员的世界里,编写代码处处充满了无奈和妥协。 (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码? (四)改掉这些坏习惯,还怕写不出健壮的代码? (五)改掉这些坏习惯,还怕写不出精简的代码? 上次讨论了一下如何借助注解来精简代码,代码修炼的系列分享,书接上篇,本次继续探讨一下:还有哪些奇淫技巧,能助力写出精简的代码? 1 编...

slw20010213的博客 195

(四)改掉这些坏习惯,还怕写不出健壮的代码?(转载)

Code Review 是一场苦涩但有意思的修行。 (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码? 书接上篇,本次继续探讨一下,该如何写出健壮的代码? 编码时:看似顺眼,实则不然。 举个栗子: String amount = request.getParameter(“amount”); // 校验金额小数点后最多两位小数 BigDecimal a = new BigDecimal(amount); if (a.d

shuirenbushijun的博客 177

java入职写不出代码_(四)改掉这些坏习惯,还怕写不出健壮的代码?

Code Review 是一场苦涩但有意思的修行。书接上篇,本次继续探讨一下,该如何写出健壮的代码?编码时:看似顺眼,实则不然。 举个栗子:String amount = request.getParameter("amount");// 校验金额小数点后最多两位小数BigDecimal a = new BigDecimal(amount);if (a.doubleValue() * 100 - ...

weixin_39997173的博客 191

从低效到高效:TypeScript 开发中必须改掉的 5 个坏习惯

在 TypeScript 开发中,改掉这些坏习惯,能让我们更好地利用 TypeScript 的特性,编写出更健壮、更易维护的代码。从避免过度使用any类型,到充分利用接口、泛型、类型推断等特性,每一个改变都将提升我们的开发效率和代码质量。让我们在 TypeScript 的世界里,不断优化编程习惯,创造出更优秀的前端应用。到这里,这篇文章就和大家说再见啦!我的过往文章里还藏着许多干货,感兴趣的话也可以点击我的主页看看,下面的文章也很精彩,可别错过。💕。

前端开发探索之旅 996

(五)改掉这些坏习惯,还怕写不出精简的代码?(转载)

鲁迅说:嬉笑怒骂里充满了无奈和妥协。 小猿说:先生说的不对,在程序员的世界里,编写代码处处充满了无奈和妥协。 Code Review 是一场苦涩但有意思的修行。 (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码? (四)改掉这些坏习惯,还怕写不出健壮的代码? 代码修炼的系列分享,书接上篇,本次探讨一下:该如何利用注解写出精简的代码? 编码时:重复的校验,随处可见。 举个栗子: 再举个栗子: 如栗子示意,项目中参数校验随

zhongqill的博客 180

TypeScript 必须改掉的 10 个坏习惯

随着 TypeScript 生态系统的进一步成熟,有些你以前觉得合理的做法,现在可能不太合理。接下来,我将分享10 个常见的 TypeScript 坏习惯,并告诉你如何改进它们,确保你的代码更健壮、性能更高、并且更加易于维护。依赖隐式类型检查而非明确的类型保护,可能导致你错过一些重要的类型问题。

csdn_wzq的博客 1202

java十进制小数转化为二进制小数代码 乘二取整法_(四)改掉这些坏习惯,还怕写不出健壮的代码?...

Code Review 是一场苦涩但有意思的修行。(一)改掉这些坏习惯,还怕写不出健壮的代码?(二)改掉这些坏习惯,还怕写不出优雅的代码?(三)改掉这些坏习惯,还怕写不出优雅的代码?书接上篇,本次继续探讨一下,该如何写出健壮的代码?1编码时:看似顺眼,实则不然。举个栗子?:String amount = request.getParameter("amount");// 校验金额小数...

weixin_29284201的博客 355

直接输出代码_(二)改掉这些坏习惯,还怕写不出优雅的代码?

Code Review 是一场苦涩但有意思的修行。上期分享,通过示例剖析编码中一些经常触犯的性能点,以及编码时常犯的一些小毛病,来告诉新手程序员如何写出健壮的代码。咱们书接上篇,本次一起来探讨一下,该如何写出优雅的代码?编码时:少一点不行 坏习惯一:记录日志时,缺失参数。反例:正解:1. 日志打印时,占位符 {} 要严格与参数相对应,如果对应不上,按照截图示意,日志输出则不会打印 queryStr...

weixin_42509708的博客 102
上一篇: 真实|技术人员该如何站好最后一班岗?
下一篇: (二)改掉这些坏习惯,还怕写不出优雅的代码?
一猿小讲
博客等级 码龄15年 294粉丝 156原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值