几个友好Java代码习惯建议

2023-11-14

我工作多年,遇到过各种各样的同事。我见过各种代码,优秀的、垃圾的、没有吸引力的等等,所以这篇文章记录了一个优秀的Java开发应该具备哪些良好的开发习惯或最佳实践。

1、封装方法参数

当你的方法参数过多时,建议封装一个对象。下面是反面教材,谁教你写成这样的代码?

public void updateX(long num, String str1, String str2,                     String str3, String str4,                    String str5, String str6) {}

尽量把这些输出封装到一个对象中。

public class X {    private Long num;    private String str1;    ...}

为什么要这样写?例如,您的方法用于查询。如果以后添加查询条件,需要修改方法吗?每次添加时必须更改方法参数列表。封装一个对象,以后无论添加多少查询条件,只需要给对象添加字段即可。关键是代码看起来也很舒服!

2、封装业务逻辑

如果你看过“狗屎山”,你会有很深的感受。这样的方法可以写几千行代码,没有什么规则可言。经常负责人会说,这个业务太复杂了,没办法改进,是偷懒的借口。无论业务多么复杂,我们都可以通过合理的设计和封装来提高代码的可读性。下面是一个建议的代码。

@Transactionalpublic void clearBills(Long customerId) {    //获取清算所需的票据ng    ClearContext context = getClearContext(customerId);    // 验证该金额是否合法    checkAmount(context);    // 确定优惠券是否可用,并返回可扣除金额    CouponDeductibleResponse deductibleResponse = couponDeducted(context);    // 结清所有账单    DepositClearResponse response = clearBills(context);    // 发送还款对账消息    repaymentService.sendVerifyBillMessage(customerId, context.getDeposit());    // 更新帐户余额    accountService.clear(context, response);    // 处理已清算的息票,用完或未绑定    couponService.clear(deductibleResponse);    // 保存优惠券扣减记录    clearCouponDeductService.add(context, deductibleResponse);}

这段代码中的业务非常复杂。估计内部保守做了一万件事情,但是不同层次的人写的东西完全不一样。不得不赞这个业务的拆分,方法的封装。大企业中有多个小企业。不同的业务可以调用不同的服务方法。

接手的人即使没有流程图等相关文件,也能快速了解业务。初级开发写的很多业务方法都是上一行代码给业务A,下一行代码给业务B,下一行代码给业务A。还有一堆单元逻辑嵌套在业务之间调用,这非常混乱并且有很多代码。

3、判断集合类型不为空的正确方法

很多人喜欢写这样的代码来判断集合。

if (list == null || list.size() == 0) {  return null;}

当然,如果你坚持这样写是没有问题的。

org.springframework.util.CollectionUtils但是你不觉得不舒服吗,现在框架中的任何一个jar包都有一个收集工具类,比如com.baomidou.mybatisplus.core.toolkit.CollectionUtils. 以后请这样写。

if (CollectionUtils.isEmpty(list)) {  return null;}

4、集合类型返回值不返回null

当你的业务方法返回一个集合类型时,请不要返回null,正确的操作是返回一个空集合。看一下mybatis的列表查询。如果没有查询任何元素,它将返回一个空集合而不是 null。否则,调用者必须做NULL判断,大多数情况下对象也是如此。

5、推荐使用lombok

当然,这是一个有争议的问题,我的习惯是使用它来省略 getter、setter、toString 等。使用Lombok。

6、编写尽可能少的工具

为什么要少写一些工具类,因为你写的大部分工具类都包含在你引入的jar包中,比如String、Assert断言、IO上传文件、复制流、Bigdecimal]等等。编写自己的错误并加载冗余类很容易。

7、写有意义的方法注释

写这种注释是不是怕后来接手的人瞎了。

要么不要写它,要么只是在它之后添加一个描述。写这样的注释并从IDEA收到一堆警告很痛苦。

/*** 请求号码验证** @param a* @param b* @param param* @return Result*/

8、尽量不要让IDEA报警

很反感在IDEA代码窗口看到一连串的警告,很不舒服。因为有警告,说明代码可以优化,或者有问题。几天前,我在团队中发现了一个小错误。和我没有关系,只是同事们在外面看业务,判断业务为什么错了。我扫了一眼问题。

因为java中的整型字面量int是类型的,所以它们变成Integer了集合,然后点击它stepId就是一个long类型,而Long在集合中,那么这contains正确返回false了,它不是一个类型。

你看,如果你注意警告,你可以把鼠标移到上面看一下提示,就会少一个生产bug。

9、尽可能使用新的技术组件

我认为这是一个程序员应该具备的素质。反正我喜欢用新的技术部件,因为新技术组件的出现是解决老技术组件的不足,而作为技术人员,我们应该与时俱进。

当然,前提是做好准备,而不是想当然地升级。Java 17 已经发布了最简单的例子,新项目仍然使用Date来处理 DateTime。

 点击此处免费领取java资料

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几个友好Java代码习惯建议 的相关文章

  • 使用 ProcessBuilder 运行 msys.bat

    我正在尝试使用 ProcessBuilder 在 java 中运行 msys bat 当我使用程序运行 bat 文件时 出现以下错误 找不到 rxvt exe 或 sh exe 二进制文件 正在中止 按任意键继续 这是代码 ProcessB
  • 批处理脚本一次运行多个 Jar 文件

    我有两个批处理文件 我想立即运行它们 所以我写了这个 echo off java jar happyjar jar java jar sadjar jar pause 当我运行脚本时 它首先运行 happyjar 然后运行 Sadjar 是
  • war文件可以部署在任何服务器上吗?

    如果这个问题很愚蠢 请原谅我 假设我使用 Spring 框架和 MS SQL Server 数据库以及 WebSphere 应用程序服务器开发一个 J2EE Web 应用程序 我后来为此应用程序创建了一个 WAR 文件 我可以在不更改代码的
  • 使用 JodaTime 将 UTC 转换为本地时间(以毫秒为单位)

    我正在尝试使用 Jodatime 显示特定时间段内的交易 我们的服务器要求开始日期和结束日期采用 UTC 这可能是显而易见的 因此 围绕这些的任何业务逻辑都使用 DateTime 对象 并将时区设置为DateTimeZone UTC e g
  • 区域设置的 Java 日期格式

    我怎样才能找到DateFormat对于给定的Locale DateFormat getDateInstance int Locale 例如 import static java text DateFormat DateFormat f ge
  • 如何反编译混淆的java程序以避免类/包名称冲突

    我想反编译一个java程序并重新编译派生的 混淆的 源代码 我解压了 jar 存档并得到了如下目录结构 com com foo A com foo A A class com foo A B Class com foo B A class
  • 使用当前用户的凭据进行 javamail NTLM 身份验证

    如何将 JavaMail API 与 NTLM 身份验证结合使用到 Exchange 服务器 而无需指定用户名和密码 而是自动使用当前登录用户的凭据 单点登录 我的目的是让我的客户端程序 在我公司网络中的 Windows 计算机上运行 能够
  • 何时在 Springs @Configuration 中将 proxyBeanMethods 设置为 false?

    当查看 spring 自动配置时源代码 https github com spring projects spring boot tree master spring boot project spring boot autoconfigu
  • 如何缓解 Apache Log4j 反序列化 RCE (CVE-2019-17571)

    我已将 log4j core 依赖项升级到 2 15 0 以防止任何潜在的 Log4Shell 攻击 话虽如此 我无法从 1 2 17 升级 slf4j log4j12 的间接 log4j 依赖项 因为 slf4j log4j12 的最新稳
  • 在 Java 中从 Json 字符串中提取字段

    我正在尝试从以下 Json 字符串中提取每个 company id 的 id String test company id 4100 data drm user id 572901936637129135 direct status id
  • LDAP中超时的实现

    我一直在处理我们正在使用的应用程序LDAP获取用户详细信息 有时获取用户详细信息需要更多时间 我想实施time out获取详细信息的方法 以便我们可以避免在最坏的情况下在服务器中挂起事务 这里我们使用的是LdapUtil我们在其中配置的类L
  • 通常可重用的注释或公共注释?

    有没有常用的注释 类似于 commons lang 如果没有 您是否见过在任何开源应用程序开发中有效使用注释 不是内置注释 的情况 我记得 Mifos 用它来进行交易 Mohan i think 休眠验证器 http www hiberna
  • 动态添加组件到 JDialog

    当用户单击 JDialog 上的按钮时 我在将组件添加到 JDialog 时遇到问题 基本上我希望它看起来像这样 然后 当用户单击 添加新字段 时 我希望它看起来像这样 我似乎无法打开添加新 JLabel 或 JTextField 的对话框
  • 如何使用 JAVA 将本地图像而不是 URL 发送到 Microsoft Cognitive Face API

    我正在尝试使用 Microsoft 认知服务的 Face API 我想知道如何通过 Rest API 调用将本地图像发送到 Face API 并使用它请求结果JAVA 有人可以帮我解决这个问题吗 Microsoft 在其网站上提供的测试选项
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 当将 Eclipse 与 FindBugs 一起使用时,您可以将错误标记为非错误并将其从错误列表中删除吗?

    FindBugs 在我的代码中发现了潜在的错误 但这不是一个错误 是否可以将此事件标记为 不是错误 并将其从错误列表中删除 我已经非常清楚地记录了为什么每种情况都不是错误 例如 类实现类似的接口 它有compareTo方法 然而 我没有重写
  • 使用 getPathMatcher 的全局模式

    从 OCP 考试的 Kathy Sierra Bert Bates 书中我找到了以下代码 public class FileTest public static void matches Path path String glob Path
  • 如何在jsf页面中嵌入java代码?

    我有 一个名为 LoginBean 的托管 bean 名为 login xhtml 的 JSF 页面 在这个 jsf 页面中 我有一个登录表单 在managebean 内部我有一个loginCheck 函数 public void logi
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc

随机推荐