前置知识: Java

Java Objects 工具类语法速查手册

1 min入门

Java Objects 工具类语法速查手册 的完整教学讲解。

0. 本节阅读指引(先读这一节)

本篇是「Objects 工具类」语法速查手册,按需查阅。

零基础第一遍只读:非空检查(requireNonNull 是防御性编程核心)、相等与哈希、比较操作;其余小节遇到再查。

前置:014 面向对象编程。

非空检查

基本写法:要求非空 Objects.requireNonNull(<对象>);

// 为 null 抛 NullPointerException
Objects.requireNonNull(name);

基本写法:带消息的非空检查 Objects.requireNonNull(<对象>, <消息>);

// 抛出带消息的 NPE
Objects.requireNonNull(name, "name 不能为空");

基本写法:带 Supplier 消息 Objects.requireNonNull(<对象>, <Supplier>);

// 延迟构造消息
Objects.requireNonNull(name, () -> "字段 " + fieldName + " 不能为空");

基本写法:requireNonNullElse Objects.requireNonNullElse(<对象>, <默认值>);

// Java 9+ 为 null 返回默认值
String v = Objects.requireNonNullElse(name, "default");

基本写法:requireNonNullElseGet Objects.requireNonNullElseGet(<对象>, <Supplier>);

// 为 null 时用 Supplier 生成默认值
String v = Objects.requireNonNullElseGet(name, () -> fetchDefault());

相等与哈希

基本写法:判等 Objects.equals(<a>, <b>);

// 安全的 equals,避免 NPE
boolean ok = Objects.equals(a, b);

基本写法:深度判等 Objects.deepEquals(<a>, <b>);

// 数组深度比较
boolean ok = Objects.deepEquals(arr1, arr2);

基本写法:哈希码 Objects.hash(<字段>...);

// 多字段组合哈希码
@Override public int hashCode() {
    return Objects.hash(name, age);
}

基本写法:单值哈希 Objects.hashCode(<对象>);

// 单个对象的哈希码
int h = Objects.hashCode(name);

字符串表示

基本写法:toString Objects.toString(<对象>);

// 调用 toString,null 返回 "null"
String s = Objects.toString(obj);

基本写法:带默认值 toString Objects.toString(<对象>, <默认值>);

// 为 null 返回默认值
String s = Objects.toString(obj, "N/A");

基本写法:toIdentityString Objects.toIdentityString(<对象>);

// 返回类名@哈希码形式
String s = Objects.toIdentityString(obj);

比较操作

基本写法:比较 Objects.compare(<a>, <b>, <比较器>);

// 用比较器比较两个对象
int r = Objects.compare("a", "b", Comparator.naturalOrder());

索引检查

基本写法:检查索引 Objects.checkIndex(<索引>, <长度>);

// 检查索引在 [0, length) 范围
int i = Objects.checkIndex(5, 10);

基本写法:检查范围 Objects.checkFromToIndex(<起>, <止>, <长度>);

// 检查 [from, to) 在 [0, length) 范围
Objects.checkFromToIndex(2, 5, 10);

基本写法:检查起始长度 Objects.checkFromIndexSize(<起>, <大小>, <长度>);

// 检查 [from, from+size) 在 [0, length) 范围
Objects.checkFromIndexSize(2, 3, 10);

数组相关

基本写法:数组相等 Objects.equals(<数组1>, <数组2>);

// 用 Objects.equals 比较数组引用
boolean same = Objects.equals(arr1, arr2);

验证工具

基本写法:校验后返回值 <表达式> == null ? <默认> : <对象>

// 配合 requireNonNullElse 使用
String v = Objects.requireNonNullElseElseGet(name, () -> "");

防御性拷贝

基本写法:复制不可变

// 通过不可变工厂方法
List<String> imm = List.copyOf(mutableList);
// Java 10+ 拷贝为不可变集合
List<String> safe = List.copyOf(original);
Set<String> safeSet = Set.copyOf(original);
Map<String, Integer> safeMap = Map.copyOf(original);

通用工具

基本写法:获取类名 <对象>.getClass().getName();

// 获取运行时类名
String name = obj.getClass().getName();

基本写法:instanceof 模式匹配 <对象> instanceof <类型> <变量>

// Java 16+ 模式匹配
if (obj instanceof String s) {
    System.out.println(s.length());
}

防御性编程

基本写法:参数校验组合

public void set(String name, int age) {
    this.name = Objects.requireNonNull(name);
    if (Objects.checkIndex(age, 151) != age) throw new IllegalArgumentException();
}
// 综合使用 Objects 进行参数校验
public User(String name, int age) {
    this.name = Objects.requireNonNull(name, "name");
    this.age = age >= 0 && age <= 150 ? age : -1;
}