工具类规范:让公共代码有章可循
工具类是项目中最容易被滥用的地方。
一个 StringUtils 可能被改得面目全非——张三加了 isEmpty,李四加了 isNotEmpty,王五又加了个 isBlank,然后版本冲突了。
工具类的规范,是团队协作的基本功。
工具类的设计原则
必须 final 类
防止被继承:
java
// ✅ final 类,不能被继承
public final class StringUtils {
private StringUtils() {
throw new AssertionError("工具类禁止实例化");
}
// ...
}私有构造方法
防止被 new 出来:
java
// ❌ 构造方法 public,可以被 new
public class BadUtils {
public BadUtils() { }
}
// ✅ 私有构造方法,禁止实例化
public final class GoodUtils {
private GoodUtils() {
throw new AssertionError("工具类禁止实例化");
}
}全部静态方法
不需要实例化:
java
public final class StringUtils {
private StringUtils() { }
public static boolean isBlank(String str) {
return str == null || str.trim().isEmpty();
}
public static boolean isNotBlank(String str) {
return !isBlank(str);
}
public static String defaultIfBlank(String str, String defaultValue) {
return isBlank(str) ? defaultValue : str;
}
}常用工具类示例
字符串工具
java
public final class StringUtils {
private StringUtils() { }
public static boolean isBlank(String str) {
return str == null || str.trim().isEmpty();
}
public static boolean isNotBlank(String str) {
return !isBlank(str);
}
public static String defaultIfBlank(String str, String defaultValue) {
return isBlank(str) ? defaultValue : str;
}
public static String maskPhone(String phone) {
if (isBlank(phone) || phone.length() < 7) return phone;
return phone.substring(0, 3) + "****" + phone.substring(phone.length() - 4);
}
}集合工具
java
public final class CollectionUtils {
private CollectionUtils() { }
public static <T> boolean isEmpty(Collection<T> collection) {
return collection == null || collection.isEmpty();
}
public static <T> boolean isNotEmpty(Collection<T> collection) {
return !isEmpty(collection);
}
public static <T> List<T> emptyIfNull(List<T> list) {
return list == null ? Collections.emptyList() : list;
}
}不要自己造轮子
很多工具类已经有成熟的库实现了,直接用:
| 场景 | 推荐库 |
|---|---|
| 字符串处理 | Apache Commons Lang StringUtils |
| 集合处理 | Spring CollectionUtils / Apache Commons |
| 对象判断 | JDK Objects / Spring ObjectUtils |
| 日期时间 | JDK 8 java.time |
java
// ❌ 自己写
if (str != null && !str.isEmpty()) { }
// ✅ 用 Spring
if (StringUtils.hasLength(str)) { }
// ✅ 用 JDK Objects
Objects.requireNonNull(param, "参数不能为 null");总结
- final 类:防止被继承
- 私有构造:防止被实例化
- 静态方法:不需要实例化
- 不要重复造轮子:优先用成熟库
- 无状态:不要在工具类里保存可变状态
工具类是项目的公共资产,规范要严格。
