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;
/**
* 雪花算法ID生成工具类
*/
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 DATA_CENTER_BIT = 5;
// 各部分占用的位数
private static final long SEQUENCE_BIT = 12; // 序列号占用的位数
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_MACHINE_NUM = ~(-1L << MACHINE_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 DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private static final long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT;
private long dataCenterId;
private long machineId;
private long sequence = 0L;
private long lastStamp = -1L;
private long dataCenterId; // 数据中心ID
private long machineId; // 机器ID
private long sequence = 0L; // 序列号
private long lastStamp = -1L; // 上一次时间戳
private static SnowflakeIdUtil instance;
/**
* 获取单例实例
* @return SnowflakeIdUtil实例
*/
public static synchronized SnowflakeIdUtil getInstance() {
if (instance == null) {
// 默认数据中心ID和机器ID为1
instance = new SnowflakeIdUtil(1, 1);
}
return instance;
}
/**
* 构造函数
* @param dataCenterId 数据中心ID
* @param machineId 机器ID
*/
public SnowflakeIdUtil(long dataCenterId, long machineId) {
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) {
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.machineId = machineId;
}
/**
* 生成下一个ID
* @return 雪花ID
*/
public synchronized long nextId() {
long currStamp = getNewStamp();
if (currStamp < lastStamp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
throw new RuntimeException("时钟向后移动。拒绝生成ID");
}
if (currStamp == lastStamp) {
// 同一毫秒内,序列号自增
sequence = (sequence + 1) & MAX_SEQUENCE;
// 如果序列号溢出,等待下一毫秒
if (sequence == 0L) {
currStamp = getNextMill();
}
} else {
// 不同毫秒内序列号重置为0
sequence = 0L;
}
lastStamp = currStamp;
return (currStamp - START_TIMESTAMP) << TIMESTAMP_LEFT
| dataCenterId << DATA_CENTER_LEFT
| machineId << MACHINE_LEFT
| sequence;
// 拼接成64位ID
return (currStamp - START_TIMESTAMP) << TIMESTAMP_LEFT // 时间戳部分
| dataCenterId << DATA_CENTER_LEFT // 数据中心部分
| machineId << MACHINE_LEFT // 机器标识部分
| sequence; // 序列号部分
}
/**
* 获取下一毫秒的时间戳
* @return 下一毫秒的时间戳
*/
private long getNextMill() {
long mill = getNewStamp();
while (mill <= lastStamp) {
@@ -72,6 +101,10 @@ public class SnowflakeIdUtil {
return mill;
}
/**
* 获取当前时间戳
* @return 当前时间戳
*/
private long getNewStamp() {
return System.currentTimeMillis();
}

View File

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