文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-29 20:49

关注

1. Nulls and Optionals

反例:从方法返回null可能会导致最可怕的NullPointerException或NPE。

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

正例:使用Optional可以更明确地处理 null,避免出现此类错误。

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

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

反例:使用 + 运算符进行字符串连接。

double pi = 3.1415926 ;
String str = "" + pi ;

正例:使用内置方法进行字符串连接。

double pi = 3.1415926 ;
String str = String.valueOf(pi) ;

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

反例:手动复制数组

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] ;
}

这种方法效率较低,尤其是对于大数组,因为它需要进行多次迭代和元素赋值。

正例:使用 Arrays.copyOf()复制数组

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

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

反例:使用 length() 或 size() 检查字符串或集合是否为空。

String text = "Pack" ;
if (text.length() == 0) {
  // TODO
}
Set datas = new HashSet<>() ;
if (datas.size() == 0) {
  // TODO
}

正例:使用 isEmpty() 检查字符串或集合是否为空。

String text = "Pack" ;
if (text.isEmpty()) {
  // TODO
}
Set datas = new HashSet<>() ;
if (datas.isEmpty()) {
  // TODO
}

5. 避免并发修改异常

反例:在遍历列表时从列表中删除元素会导致 ConcurrentModificationException 异常。

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

输出结果

图片

正例:使用迭代器的 remove 方法或 removeIf() 方法

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

你也可以使用 Java 8 中引入的 removeIf() 方法,根据给定条件删除元素。

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

该方法在内部使用迭代器并移除与条件匹配的元素。这是一种更简洁、可读性更强的方法。

6. 预编译正则表达式

反例:运行时编译正则表达式

String str = "Hello, World" ;
if (str.matches("Hello.*")) {
  System.out.println(true) ;
}

正例:预编译正则表达式

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

通过预编译重复使用的正则表达式,并在需要时重复使用它,我们可以避免不必要的编译,并提高性能。

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

反例:先判断是否存在然后在获取数据

public static void process(Map params) {
  if (params.containsKey("action")) {
    String value = params.get("action") ;
    // TODO
  }
}

正例:直接获取值判断是否null

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

这种方法避免了多余的检查,使代码更简洁、更高效。

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

反例:

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

在这种方法中,首先计算列表的大小,然后创建一个新数组。这可能会影响性能,尤其是对于大数据集。

正例:

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

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

9. 合理使用默认方法

反例:

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 等新方法,则必须修改所有实现类,这可能会导致代码维护问题和潜在错误。

正例:

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

在这里,Logger接口定义了一个默认方法(logError),它提供了记录错误的默认实现。这样实现类无需修改即可自动继承该默认实现。

10. 使用Date/Time API

反例:使用传统的Date类

Date birthday = new Date() ;
// TODO

这个类有很多问题,比如可变性和方法不够清晰;该类中的大部分方法,如 getYear()、getMonth() 和 getDay() 已被弃用。

正例:使用Date/Time API(Java 8 及以后版本)中的类

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

在这里,使用来自Date/Time API的LocalDate、LocalDateTime类;这两个类是不可变的,确保了线程的安全性,并为日期操作提供了清晰直观的方法。

11. 未使用泛型

反例:

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

不同的数据类型混杂在列表中,可能导致运行时出错。

正例:使用泛型可以确保类型安全,避免此类问题

List datas = new ArrayList<>() ;
datas.add(10) ;
// 错误
// datas.add("Hello"
来源:Spring全家桶实战案例源码内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯