From 878bc326c3cef5fc0349491c91227c52669ea710 Mon Sep 17 00:00:00 2001 From: ikmkj <1@qq,com> Date: Sun, 10 Aug 2025 12:24:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor(music-houduan):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20SnowflakeIdUtil=20=E5=92=8C=20TimeUtil=20=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为 SnowflakeIdUtil 类添加详细注释,解释各个字段和方法的作用- 为 TimeUtil 类添加方法注释,说明各个方法的功能- 优化代码结构,提高可读性和可维护性 --- .../musichouduan/util/SnowflakeIdUtil.java | 63 ++++++++++++++----- .../com/test/musichouduan/util/TimeUtil.java | 17 +++++ 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/music-houduan/src/main/java/com/test/musichouduan/util/SnowflakeIdUtil.java b/music-houduan/src/main/java/com/test/musichouduan/util/SnowflakeIdUtil.java index f2cb375..7f64796 100644 --- a/music-houduan/src/main/java/com/test/musichouduan/util/SnowflakeIdUtil.java +++ b/music-houduan/src/main/java/com/test/musichouduan/util/SnowflakeIdUtil.java @@ -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(); } diff --git a/music-houduan/src/main/java/com/test/musichouduan/util/TimeUtil.java b/music-houduan/src/main/java/com/test/musichouduan/util/TimeUtil.java index 96bdac2..1c335af 100644 --- a/music-houduan/src/main/java/com/test/musichouduan/util/TimeUtil.java +++ b/music-houduan/src/main/java/com/test/musichouduan/util/TimeUtil.java @@ -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);