refactor(music-houduan): 优化 SnowflakeIdUtil 和 TimeUtil 类

- 为 SnowflakeIdUtil 类添加详细注释,解释各个字段和方法的作用- 为 TimeUtil 类添加方法注释,说明各个方法的功能- 优化代码结构,提高可读性和可维护性
This commit is contained in:
ikmkj
2025-08-10 12:24:33 +08:00
parent 3044ad47b3
commit 878bc326c3
2 changed files with 65 additions and 15 deletions

View File

@@ -1,69 +1,98 @@
package com.test.musichouduan.util; package com.test.musichouduan.util;
/**
* 雪花算法ID生成工具类
*/
public class SnowflakeIdUtil { public class SnowflakeIdUtil {
private static final long START_TIMESTAMP = 1609459200000L; // 2021-01-01 00:00:00 // 起始时间戳 (2021-01-01 00:00:00)
private static final long START_TIMESTAMP = 1609459200000L;
private static final long SEQUENCE_BIT = 12; // 各部分占用的位数
private static final long MACHINE_BIT = 5; private static final long SEQUENCE_BIT = 12; // 序列号占用的位数
private static final long DATA_CENTER_BIT = 5; private static final long MACHINE_BIT = 5; // 机器标识占用的位数
private static final long DATA_CENTER_BIT = 5; // 数据中心占用的位数
// 各部分的最大值
private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT); private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);
private static final long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT); private static final long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT);
private static final long MAX_DATA_CENTER_NUM = ~(-1L << DATA_CENTER_BIT); private static final long MAX_DATA_CENTER_NUM = ~(-1L << DATA_CENTER_BIT);
// 各部分向左的位移
private static final long MACHINE_LEFT = SEQUENCE_BIT; private static final long MACHINE_LEFT = SEQUENCE_BIT;
private static final long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; private static final long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private static final long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT; private static final long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT;
private long dataCenterId; private long dataCenterId; // 数据中心ID
private long machineId; private long machineId; // 机器ID
private long sequence = 0L; private long sequence = 0L; // 序列号
private long lastStamp = -1L; private long lastStamp = -1L; // 上一次时间戳
private static SnowflakeIdUtil instance; private static SnowflakeIdUtil instance;
/**
* 获取单例实例
* @return SnowflakeIdUtil实例
*/
public static synchronized SnowflakeIdUtil getInstance() { public static synchronized SnowflakeIdUtil getInstance() {
if (instance == null) { if (instance == null) {
// 默认数据中心ID和机器ID为1
instance = new SnowflakeIdUtil(1, 1); instance = new SnowflakeIdUtil(1, 1);
} }
return instance; return instance;
} }
/**
* 构造函数
* @param dataCenterId 数据中心ID
* @param machineId 机器ID
*/
public SnowflakeIdUtil(long dataCenterId, long machineId) { public SnowflakeIdUtil(long dataCenterId, long machineId) {
if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) { if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) {
throw new IllegalArgumentException("Data center ID can't be greater than " + MAX_DATA_CENTER_NUM + " or less than 0"); throw new IllegalArgumentException("数据中心ID不能大于 " + MAX_DATA_CENTER_NUM + " 或小于 0");
} }
if (machineId > MAX_MACHINE_NUM || machineId < 0) { if (machineId > MAX_MACHINE_NUM || machineId < 0) {
throw new IllegalArgumentException("Machine ID can't be greater than " + MAX_MACHINE_NUM + " or less than 0"); throw new IllegalArgumentException("机器ID不能大于 " + MAX_MACHINE_NUM + " 或小于 0");
} }
this.dataCenterId = dataCenterId; this.dataCenterId = dataCenterId;
this.machineId = machineId; this.machineId = machineId;
} }
/**
* 生成下一个ID
* @return 雪花ID
*/
public synchronized long nextId() { public synchronized long nextId() {
long currStamp = getNewStamp(); long currStamp = getNewStamp();
if (currStamp < lastStamp) { if (currStamp < lastStamp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id"); throw new RuntimeException("时钟向后移动。拒绝生成ID");
} }
if (currStamp == lastStamp) { if (currStamp == lastStamp) {
// 同一毫秒内,序列号自增
sequence = (sequence + 1) & MAX_SEQUENCE; sequence = (sequence + 1) & MAX_SEQUENCE;
// 如果序列号溢出,等待下一毫秒
if (sequence == 0L) { if (sequence == 0L) {
currStamp = getNextMill(); currStamp = getNextMill();
} }
} else { } else {
// 不同毫秒内序列号重置为0
sequence = 0L; sequence = 0L;
} }
lastStamp = currStamp; lastStamp = currStamp;
return (currStamp - START_TIMESTAMP) << TIMESTAMP_LEFT // 拼接成64位ID
| dataCenterId << DATA_CENTER_LEFT return (currStamp - START_TIMESTAMP) << TIMESTAMP_LEFT // 时间戳部分
| machineId << MACHINE_LEFT | dataCenterId << DATA_CENTER_LEFT // 数据中心部分
| sequence; | machineId << MACHINE_LEFT // 机器标识部分
| sequence; // 序列号部分
} }
/**
* 获取下一毫秒的时间戳
* @return 下一毫秒的时间戳
*/
private long getNextMill() { private long getNextMill() {
long mill = getNewStamp(); long mill = getNewStamp();
while (mill <= lastStamp) { while (mill <= lastStamp) {
@@ -72,6 +101,10 @@ public class SnowflakeIdUtil {
return mill; return mill;
} }
/**
* 获取当前时间戳
* @return 当前时间戳
*/
private long getNewStamp() { private long getNewStamp() {
return System.currentTimeMillis(); return System.currentTimeMillis();
} }

View File

@@ -3,17 +3,34 @@ package com.test.musichouduan.util;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
/**
* 时间工具类
*/
public class TimeUtil { public class TimeUtil {
/**
* 获取当前时间,格式为 yyyy-MM-dd HH:mm:ss
* @return 当前时间的字符串表示
*/
public static String getCurrentTime() { public static String getCurrentTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date()); return sdf.format(new Date());
} }
/**
* 获取当前时间戳
* @return 当前时间戳(毫秒)
*/
public static long getTimestamp() { public static long getTimestamp() {
return System.currentTimeMillis(); return System.currentTimeMillis();
} }
/**
* 根据指定格式格式化日期
* @param date 要格式化的日期
* @param format 格式字符串
* @return 格式化后的日期字符串
*/
public static String formatDate(Date date, String format) { public static String formatDate(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format); SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date); return sdf.format(date);