当前位置:首页 > 科技  > 软件

Java开发人员必须掌握的11种干净代码最佳实践

来源: 责编: 时间:2024-06-27 07:56:54 75观看
导读环境:Java171. Nulls and Optionals反例:从方法返回null可能会导致最可怕的NullPointerException或NPE。public String getValue() { // TODO return null ;}正例:使用Optional可以更明确地处理 null,避免出现此类错误

环境:Java17Y0728资讯网——每日最新资讯28at.com

1. Nulls and Optionals

反例:从方法返回null可能会导致最可怕的NullPointerException或NPE。Y0728资讯网——每日最新资讯28at.com

public String getValue() {  // TODO  return null ;}

正例:使用Optional可以更明确地处理 null,避免出现此类错误。Y0728资讯网——每日最新资讯28at.com

public Optional<String> getValue() {  // TODO  return Optional.empty() ;}

2. 使用String.valueOf()优化字符串转换

反例:使用 + 运算符进行字符串连接。Y0728资讯网——每日最新资讯28at.com

double pi = 3.1415926 ;String str = "" + pi ;
  • 这里,"+"操作符用于字符串转换,涉及隐式字符串连接
  • 这种方法可能效率低下,特别是在将大量变量转换为字符串时

正例:使用内置方法进行字符串连接。Y0728资讯网——每日最新资讯28at.com

double pi = 3.1415926 ;String str = String.valueOf(pi) ;
  • 在这里,我们使用 valueOf() 进行字符串转换和连接
  • 该方法专门用于将其他数据类型转换为字符串,并对性能进行了优化

3. 使用 Arrays.copyOf()复制数组

反例:手动复制数组Y0728资讯网——每日最新资讯28at.com

int[] source = {1, 2, 3, 4, 5} ;int [] target = new int[source.length] ;for (int i = 0, len = source.length; i < len; i++) {  target[i] = source[i] ;}

这种方法效率较低,尤其是对于大数组,因为它需要进行多次迭代和元素赋值。Y0728资讯网——每日最新资讯28at.com

正例:使用 Arrays.copyOf()复制数组Y0728资讯网——每日最新资讯28at.com

int[] source = {1, 2, 3, 4, 5} ;int[] target = Arrays.copyOf(source, source.length) ;

4. 使用 isEmpty() 检查空集合

反例:使用 length() 或 size() 检查字符串或集合是否为空。Y0728资讯网——每日最新资讯28at.com

String text = "Pack" ;if (text.length() == 0) {  // TODO}Set<String> datas = new HashSet<>() ;if (datas.size() == 0) {  // TODO}
  • 这里,length() 用于检查字符串是否为空,size() 用于检查集合是否为空
  • 这些方法虽然有效,但却降低了代码的可读性

正例:使用 isEmpty() 检查字符串或集合是否为空。Y0728资讯网——每日最新资讯28at.com

String text = "Pack" ;if (text.isEmpty()) {  // TODO}Set<String> datas = new HashSet<>() ;if (datas.isEmpty()) {  // TODO}
  • isEmpty() 方法可用于字符串和集合,以检查是否为空
  • 它的时间复杂度为 O(1),因此更高效、更易读

5. 避免并发修改异常

反例:在遍历列表时从列表中删除元素会导致 ConcurrentModificationException 异常。Y0728资讯网——每日最新资讯28at.com

List<String> datas = new ArrayList<>() ;datas.add("1") ;datas.add("2") ;datas.add("3") ;for (String s : datas) {  if ("1".equals(s)) {    datas.remove(s) ;  }}

输出结果Y0728资讯网——每日最新资讯28at.com

图片图片Y0728资讯网——每日最新资讯28at.com

正例:使用迭代器的 remove 方法或 removeIf() 方法Y0728资讯网——每日最新资讯28at.com

List<String> datas = new ArrayList<>() ;// add(x)Iterator<String> it = datas.iterator() ;while (it.hasNext()) {  String value = it.next() ;  if ("1".equals(value)) {    it.remove() ;   }}

你也可以使用 Java 8 中引入的 removeIf() 方法,根据给定条件删除元素。Y0728资讯网——每日最新资讯28at.com

List<String> datas = new ArrayList<>() ;// add(x)datas.removeIf(item -> "1".equals(item)) ;

该方法在内部使用迭代器并移除与条件匹配的元素。这是一种更简洁、可读性更强的方法。Y0728资讯网——每日最新资讯28at.com

6. 预编译正则表达式

反例:运行时编译正则表达式Y0728资讯网——每日最新资讯28at.com

String str = "Hello, World" ;if (str.matches("Hello.*")) {  System.out.println(true) ;}
  • 在这里,只要使用正则表达式,就会在运行时对其进行编译
  • 重复使用相同的正则表达式会降低性能

正例:预编译正则表达式Y0728资讯网——每日最新资讯28at.com

private static final Pattern PATTERN1 = Pattern.compile("Hello.*") ; public void validateString() {  String str = "Hello, World" ;  if (PATTERN1.matcher(str).matches()) {    System.out.println(true) ;  }}

通过预编译重复使用的正则表达式,并在需要时重复使用它,我们可以避免不必要的编译,并提高性能。Y0728资讯网——每日最新资讯28at.com

7. 避免在检索前预先检查数据是否存在

反例:先判断是否存在然后在获取数据Y0728资讯网——每日最新资讯28at.com

public static void process(Map<String, String> params) {  if (params.containsKey("action")) {    String value = params.get("action") ;    // TODO  }}
  • 在这里,我们首先检查Map中是否存在指定的key,然后再检索它
  • 这种预先检查是不必要的,因为如果未找到键,则 Map的 get 方法会返回 null

正例:直接获取值判断是否nullY0728资讯网——每日最新资讯28at.com

String action = params.get("action") ;if (action != null) {  // TODO}

这种方法避免了多余的检查,使代码更简洁、更高效。Y0728资讯网——每日最新资讯28at.com

8. 将集合高效转换为数组

反例:Y0728资讯网——每日最新资讯28at.com

List<String> datas = new ArrayList<>() ;datas.add("1") ;datas.add("2") ;datas.add("3") ;String[] ret = datas.toArray(new String[datas.size()]) ;

在这种方法中,首先计算列表的大小,然后创建一个新数组。这可能会影响性能,尤其是对于大数据集。Y0728资讯网——每日最新资讯28at.com

正例:Y0728资讯网——每日最新资讯28at.com

List<String> datas = new ArrayList<>() ;// add(x)String[] ret = datas.toArray(new String[0]) ;

在这里,调用 toArray 时使用的是空数组(new String[0]),这种方法避免了计算列表大小的需要,并允许 toArray 方法在内部处理数组大小的调整,从而获得更好的性能和更简洁的代码。Y0728资讯网——每日最新资讯28at.com

9. 合理使用默认方法

反例:Y0728资讯网——每日最新资讯28at.com

public interface Logger {  void log(String message) ;}public class FileLogger implements Logger {  public void log(String message) {    // TODO  }}public class ConsoleLogger implements Logger {  public void log(String message) {    // TODO  }}

如果需要在接口中添加 logError 等新方法,则必须修改所有实现类,这可能会导致代码维护问题和潜在错误。Y0728资讯网——每日最新资讯28at.com

正例:Y0728资讯网——每日最新资讯28at.com

public interface Logger {  void log(String message) ;  default void logError(String error) {    // TODO  }}

在这里,Logger接口定义了一个默认方法(logError),它提供了记录错误的默认实现。这样实现类无需修改即可自动继承该默认实现。Y0728资讯网——每日最新资讯28at.com

10. 使用Date/Time API

反例:使用传统的Date类Y0728资讯网——每日最新资讯28at.com

Date birthday = new Date() ;// TODO

这个类有很多问题,比如可变性和方法不够清晰;该类中的大部分方法,如 getYear()、getMonth() 和 getDay() 已被弃用。Y0728资讯网——每日最新资讯28at.com

正例:使用Date/Time API(Java 8 及以后版本)中的类Y0728资讯网——每日最新资讯28at.com

LocalDate date = LocalDate.now() ;LocalDateTime dateTime = LocalDateTime.now() ;// TODO

在这里,使用来自Date/Time API的LocalDate、LocalDateTime类;这两个类是不可变的,确保了线程的安全性,并为日期操作提供了清晰直观的方法。Y0728资讯网——每日最新资讯28at.com

11. 未使用泛型

反例:Y0728资讯网——每日最新资讯28at.com

List datas = new ArrayList() ;datas.add(10) ;datas.add("Hello") ;

不同的数据类型混杂在列表中,可能导致运行时出错。Y0728资讯网——每日最新资讯28at.com

正例:使用泛型可以确保类型安全,避免此类问题Y0728资讯网——每日最新资讯28at.com

List<Integer> datas = new ArrayList<>() ;datas.add(10) ;// 错误// datas.add("Hello"

Y0728资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-96757-0.htmlJava开发人员必须掌握的11种干净代码最佳实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 面试官问到分布式事务?这样回答就对了!

下一篇: 避免消息积压的终极指南:四个关键技巧

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 之家push系统迭代之路

    之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 如何使用JavaScript创建一只图像放大镜?

    如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 自律,给不了Keep自由!

    自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 微博大门常打开,迎接海外画师漂洋东渡

    微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top