您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

20个 Java 优秀实践,让你的代码更丝滑

时间:2023-03-16 14:32:28  来源:今日头条  作者:迷路的架构师

1 尽可能使用基本类型而不是包装类型

Long idNumber;
long idNumber; // long 比 Long 占用更少的内存

2 为变量选择合适的类型

如果两种或多种类型满足功能需求,请使用占用内存空间较小的类型。

int birthYear;
short birthYear; // 更好,因为出生年份不能超过 32767 

int personRunningSpeedKmHour;
byte personRunningSpeedKmHour; // 更好,因为一个人的速度不能超过 127 公里/小时

3 检查数字是否奇数,按位与运算符比算术模运算符快得多

public boolean isOdd(int num) {
return (num & 1) != 0;
} 
// 判断数字为奇数的最佳方法

4 避免冗余初始化

不要用默认值来初始化类变量,例如,boolean默认情况下值为false,所以用 false 值初始化是多余的。

String name = null; // 冗余
int speed = 0; // 冗余
boolean isOpen = false; // 冗余


String name; 
int speed;
boolean isOpen;
// 这样更清晰

5 尽可能将类成员声明为私有

public int age; // 非常差
int age; // 差
private int age; // 好

6 在创建字符串时避免使用'new'关键字

String s1 = new String("AnyString") ; // 不好:初始化慢
// 需要构造函数创建一个新对象,并将文字添加到堆中


String s2 = "AnyString" ; // 好:快速实例化
// 此快捷方式引用字符串池中的项
// 并且仅当文字不在字符串池中时才创建新对象。

7 对于多个字符串连接,使用 StringBuilder 或 StringBuffer

+运算符效率低下,因为 JAVA 编译器在创建最终串联字符串之前会创建多个中间字符串对象。而StringBuilder或者StringBuffer是在不创建中间 String 对象的情况下修改 String。

String address = streetNumber +" "+ streetName +" "
+cityName+" "+cityNumber+" "+ countryName; // 差


StringBuilder address = new StringBuilder(streetNumber).Append(" ")
.append(streetName).append(" ").append(cityName).append(" ")
.append(cityNumber).append(" ").append(countryName); // 好

注意:StringBuilder不是线程安全的,不是同步的,StringBuffer线程安全和同步的,StringBuilder 比 StringBuffer 更快。

8 在数字文字中使用下划线

int myMoneyInBank = 58356823;
int myMoneyInBank = 58_356_823; // 更易读

long billsToPay = 1000000000L;
long billsToPay = 1_000_000_000L; // 更易读

9 避免使用索引进行“for 循环”

如果可以用增强的 for 循环(自 Java 5 起)或 forEach(自 Java 8 起)。因为索引变量容易出错,因为我们可能会在循环体中更改它,或者遍历的时候可能会从 1 而不是 0 开始索引。

for (int i = 0; i < names.length; i++) {
  saveInDb(names[i]);
}


for (String name : names) { 
  saveInDb(name);
} // 更清晰

10 将 try–catch-finally 替换为 try-with-resources

Scanner scanner = null;
try {
  scanner = new Scanner(new File("test.txt"));
  while (scanner.hasNext()) {
    System.out.println(scanner.nextLine());
  }
} 
catch (FileNotFoundException e) {
  e.printStackTrace();
} 
finally {
  if (scanner != null) {
    scanner.close();
  }
}
// 容易出错,因为我们可能会忘记在 finally 块中关闭扫描器



try (Scanner scanner = new Scanner(new File("test.txt"))) {
  while (scanner.hasNext()) {
    System.out.println(scanner.nextLine());
  }
} 
catch (FileNotFoundException fnfe) {
  fnfe.printStackTrace();
} 
// 更清晰更简洁

11 catch块不为空

一个空的catch块会使程序默默地失败并且不会给出任何关于出错的信息。

try { 
  productPrice = Integer.parseInt(integer); 
} 
catch (NumberFormatException ex){
} 
// 静默失败,不提供任何反馈


try {
  productPrice = Integer.parseInt(integer);
} 
catch (NumberFormatException ex) {
  unreadablePrices.add(productPrice); // 处理错误
  log.error("Cannot read price : ", productPrice );// 打印正确且有意义的消息
}

12 尽可能避免空指针异常

通过以下方式尽量避免运行时可能出现的空指针异常:

  • 返回空集合而不是返回 Null 元素
  • 尽可能使用 Optional
  • 使用 java.utils.Objects 的requireNonNull方法
  • 使用NotNull, NotEmpty,NotBlank 注解
  • 在Streams 使用 Objects::nonNull
  • java.util.Objects 中的 requireNonNull方法

13 只添加需要的 getters/setters 和构造函数并避免使用 lombok (YAGNI)

Lombok 是一个很棒的工具,可以帮助你生成一些样板代码,但它有一些缺点,例如 IDE 不兼容、使用非公共 API 且与 Java 编译器紧密耦合。

14 检查相等性

使用==判断引用是否相等,使用 equals 判断对象是否相等。

// 先决条件:person 类重写 equals() 和 hashCode() 
Person  p1  =  new  Person ( "John" , "Doe" ); 
Person  p2  =  new  Person ( "John" , "Doe" ); 

System.out.println(p1 == p2); // false
System.out.println(p1.equals(p2)); // true

15 在实现 equals 时始终实现 hashCode

如果你重写了 hashCode,必须要重写 equals。
根据 API,如果两个对象的 equals 相等,那么他们的 hashCode() 返回的结果必须相等。反之则不一定成立。

16 不可变数据的 record(自 java14 起关键字)

public final class Person {
    private final String name;
    private final long idNumber;

    public Person(String name, long idNumber) {
        this.name = name;
        this.idNumber = idNumber;
    }

    public boolean equals(Object other) {
        if (other == this) return true;
        if (other == null) return false;
        if (other.getClass() != this.getClass()) return false;
        Person that = (Person) other;
        return (this.name.equals(that.name)) && (this.idNumber == that.idNumber);
    }

    public String toString() {
        return name + " " + idNumber;
    }

    public int hashCode() {
        return Objects.hash(idNumber, name);
    }
}



// 这个类可以转化为一条记录:
record Person(String name, long idNumber) { } // 更简洁

17 定义常量,使用枚举或 final 类而不是接口

使用 final 类,并定义一个私有构造函数

public final class MyValues {
  private MyValues() {
    // 无需实例化类,我们可以隐藏其构造函数
  }
  public static final String VALUE1 = "foo";
  public static final String VALUE2 = "bar";
}

18 注解前加空行

// <-- 空行
@Repository 
public class ...
 

19 静态字段应该放在类的顶部

20 日期类型处理

建议使用 java.localDateTime(从 Java 8 开始)而不是 java.util.Date 。



Tags:Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1 尽可能使用基本类型而不是包装类型Long idNumber;long idNumber; // long 比 Long 占用更少的内存2 为变量选择合适的类型如果两种或多种类型满足功能需求,请使用占用内存...【详细内容】
2023-03-16  Tags: Java  点击:(0)  评论:(0)  加入收藏
我们平时在写代码的时候经常会遇到这样的一种情况 提示说没有处理xxx异常然后解决办法可以在外面加上try-catch,就像这样 所以我之前经常这样处理//重新抛出 RuntimeExceptio...【详细内容】
2023-03-02  Tags: Java  点击:(15)  评论:(0)  加入收藏
Java编程语言是一种高级的、面向对象的语言,它使开发人员能够创建健壮的、可重用的代码。Java以其可移植性和平台独立性而闻名,这意味着Java代码可以在任何支持Java运行时环境...【详细内容】
2023-02-25  Tags: Java  点击:(4)  评论:(0)  加入收藏
/ 前言 / 无论是 Android 开发者还是 Java 工程师应该都有使用过 JNI 开发,但对于 JVM 如何加载 so、Android 系统如何加载 so,可能鲜有时间了解。 本文通过代码、流程解释,带...【详细内容】
2023-02-10  Tags: Java  点击:(44)  评论:(0)  加入收藏
国际化是产品、应用程序或文档内容的设计和开发,它可以为不同文化、地区或语言的目标受众轻松实现本地化。国际化(Internationalization)通常用英文写成 i18n,其中 18 是英文单...【详细内容】
2023-02-01  Tags: Java  点击:(42)  评论:(0)  加入收藏
作者:小傅哥 博客:https://bugstack.cn - 包含: Java 基础,面经手册,Netty4.x,手写Spring,用Java实现JVM,重学Java设计模式,SpringBoot中间件开发,IDEA插件开发,DDD系统架构项目开发,字...【详细内容】
2023-01-13  Tags: Java  点击:(43)  评论:(0)  加入收藏
本文讨论了对 HTML 代码可视化文档的需求,并提供了一个免费的 API 解决方案,可将 HTML 字符串转换为 PNG 屏幕截图。 自 20 世纪 80 年代后期的构想以来,超文本标记语言 (HTML)...【详细内容】
2022-12-21  Tags: Java  点击:(66)  评论:(0)  加入收藏
1. Spring注入有四种方式:&middot; set注入这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然...【详细内容】
2022-11-15  Tags: Java  点击:(34)  评论:(0)  加入收藏
一、ssh登录服务器1、在终端(这里的终端版本我使用的是 SecureCrt-8.5.4)中输入连接命令ssh root@[ipaddress]。您需要将其中的 ipaddress 替换为您的服务器的公网IP地址。例...【详细内容】
2022-11-14  Tags: Java  点击:(356)  评论:(0)  加入收藏
理解锁的基础知识如果想要透彻的理解java锁的来龙去脉,需要先了解以下基础知识。基础知识之一:锁的类型按照其性质分类1)公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来...【详细内容】
2022-11-09  Tags: Java  点击:(25)  评论:(0)  加入收藏
▌简易百科推荐
1 尽可能使用基本类型而不是包装类型Long idNumber;long idNumber; // long 比 Long 占用更少的内存2 为变量选择合适的类型如果两种或多种类型满足功能需求,请使用占用内存...【详细内容】
2023-03-16  迷路的架构师  今日头条  Tags:Java   点击:(0)  评论:(0)  加入收藏
类加载器(1)类的加载当我们的程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中。 说明:a.图中的Class对象是指:java....【详细内容】
2023-03-12  时过境迁0114  今日头条  Tags:Java   点击:(3)  评论:(0)  加入收藏
前言工厂设计模式可能是最常用的设计模式之一,我想大家在自己的项目中都用到过。可能你会不屑一顾,但这篇文章不仅仅是关于工厂模式的基本知识,更是讨论如何在运行时动态选择...【详细内容】
2023-03-10  JAVA旭阳  今日头条  Tags:   点击:(9)  评论:(0)  加入收藏
在本文中,我们将研究Dynatrace在托管多个JVM的机器上报告的内存饱和错误的解决方案。在Linux机器上,当内存使用率超过80%且页面错误超过每秒20个页面错误时,Dynatrace会抛出内...【详细内容】
2023-03-08    粤嵌教育  Tags:Java   点击:(11)  评论:(0)  加入收藏
你可能已经迫不及待想安装Java,写个Java程序跑起来了。但是在这之前,有些概念需要提前了解,因为Java跟C、C++和Python都有点不一样。编译和执行​我们在文本文件中编写英文代...【详细内容】
2023-03-08  测试开发刚哥  微信公众号  Tags:Java   点击:(10)  评论:(0)  加入收藏
本文以Java线程为例介绍并行处理。所讨论的许多挑战也适用于其他编程语言,如C++或C#。一目了然并行编程技术是有效利用多核系统(多核处理器、图形卡或HPC集群)所必需的。内存...【详细内容】
2023-03-06  粤嵌教育    Tags:Java   点击:(4)  评论:(0)  加入收藏
1992年Oak相关操作系统、类库等完成,11月,“Green计划”被转化成“FirstPerson有限公司”(致力高度互动的设备),关于机顶盒的交易屡败,Green项目几乎接近夭折。一、Java的发展简史...【详细内容】
2023-03-06    Java进阶学习交流  Tags:Java   点击:(7)  评论:(0)  加入收藏
在介绍Java如何一步步被执行起来之前,我们需要先弄明白为什么Java可以实现跨平台运行,因为搞清楚了这个问题之后,对于我们理解Java程序如何被CPU执行起来非常有帮助。无论是刚...【详细内容】
2023-03-05  慕枫技术笔记  微信公众号  Tags:Java   点击:(29)  评论:(0)  加入收藏
前言泛型机制在项目中一直都在使用,比如在集合中ArrayList<String, String>​, Map<String,String>等,不仅如此,很多源码中都用到了泛型机制,所以深入学习了解泛型相关机制对于...【详细内容】
2023-03-04  JAVA旭阳  微信公众号  Tags:Java   点击:(5)  评论:(0)  加入收藏
本篇带给大家Arthas的一些常用命令,可以帮助开发者快速定位和解决Java应用中的问题。当然,Arthas还有许多其他的功能和命令,这里只是介绍了一部分。Arthas是阿里开源的一款Java...【详细内容】
2023-03-03  摆脱格子衫  今日头条  Tags:Arthas   点击:(13)  评论:(0)  加入收藏
站内最新
站内热门
站内头条