<a id="1"></a>
// 正确示例
public final class StringUtils {
private StringUtils() {
throw new AssertionError("No StringUtils instances for you!");
}
public static boolean isBlank(CharSequence cs) {
// 实现略
}
}
// 错误示例:可能被实例化
public class DateUtils {
// 缺少私有构造器
}
原理剖析:私有构造函数 + AssertionError 双重保障,防止通过反射攻击实例化
// 正确的原子性方法
public static String generateUUID() {
return UUID.randomUUID().toString().replace("-", "");
}
// 违反原子性的方法
public static void processData(String data) {
validate(data); // 验证
parse(data); // 解析
save(data); // 存储
}
血泪教训:某电商平台因工具方法包含多个操作,导致日志工具类发生内存泄漏
<a id="2"></a>
public class DateUtil {
private static final Map<String, ThreadLocal<SimpleDateFormat>> formatMap = new ConcurrentHashMap<>();
public static String format(Date date, String pattern) {
return getDateFormat(pattern).get().format(date);
}
private static ThreadLocal<SimpleDateFormat> getDateFormat(String pattern) {
return formatMap.computeIfAbsent(pattern, p ->
ThreadLocal.withInitial(() -> new SimpleDateFormat(p)));
}
}
性能对比:
实现方式 | 100万次调用耗时 | 内存占用 |
---|---|---|
传统SimpleDateFormat | 3200ms | 15MB |
ThreadLocal方案 | 850ms | 2MB |
public class DateTimeUtil {
private static final DateTimeFormatter CACHE_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault());
public static String formatInstant(Instant instant) {
return CACHE_FORMATTER.format(instant);
}
}
注意事项:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。