diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/ChineseDate.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/ChineseDate.java index 4c7bfba45..d9ef2ed4f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/chinese/ChineseDate.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/ChineseDate.java @@ -6,11 +6,6 @@ import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TimeUtil; import cn.hutool.core.date.Zodiac; -import cn.hutool.core.date.chinese.ChineseMonth; -import cn.hutool.core.date.chinese.GanZhi; -import cn.hutool.core.date.chinese.LunarFestival; -import cn.hutool.core.date.chinese.LunarInfo; -import cn.hutool.core.date.chinese.SolarTerms; import cn.hutool.core.text.StrUtil; import java.time.LocalDate; @@ -140,7 +135,12 @@ public class ChineseDate { * @param isLeapMonth 当前月份是否闰月 * @since 5.7.18 */ - public ChineseDate(final int chineseYear, final int chineseMonth, final int chineseDay, final boolean isLeapMonth) { + public ChineseDate(final int chineseYear, final int chineseMonth, final int chineseDay, boolean isLeapMonth) { + if(chineseMonth != LunarInfo.leapMonth(chineseYear)){ + // issue#I5YB1A,用户传入的月份可能非闰月,此时此参数无效。 + isLeapMonth = false; + } + this.day = chineseDay; // 当月是闰月的后边的月定义为闰月,如润的是五月,则5表示五月,6表示润五月 this.isLeapMonth = isLeapMonth; diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/intern/Interner.java b/hutool-core/src/main/java/cn/hutool/core/lang/intern/Intern.java similarity index 94% rename from hutool-core/src/main/java/cn/hutool/core/lang/intern/Interner.java rename to hutool-core/src/main/java/cn/hutool/core/lang/intern/Intern.java index c7f4563b8..434671d25 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/intern/Interner.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/intern/Intern.java @@ -9,7 +9,7 @@ package cn.hutool.core.lang.intern; * @author looly * @since 5.4.3 */ -public interface Interner { +public interface Intern { /** * 返回指定对象对应的规范化对象,sample对象可能有多个,但是这些对象如果都equals,则返回的是同一个对象 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/intern/InternUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/intern/InternUtil.java index e957e3a42..11f2d2409 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/intern/InternUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/intern/InternUtil.java @@ -12,29 +12,29 @@ public class InternUtil { * 创建WeakHshMap实现的字符串规范化器 * * @param 规范对象的类型 - * @return {@link Interner} + * @return {@link Intern} */ - public static Interner createWeakInterner(){ - return new WeakInterner<>(); + public static Intern ofWeak(){ + return new WeakIntern<>(); } /** * 创建JDK默认实现的字符串规范化器 * - * @return {@link Interner} + * @return {@link Intern} * @see String#intern() */ - public static Interner createJdkInterner(){ - return new JdkStringInterner(); + public static Intern ofString(){ + return new StringIntern(); } /** * 创建字符串规范化器 * * @param isWeak 是否创建使用WeakHashMap实现的Interner - * @return {@link Interner} + * @return {@link Intern} */ - public static Interner createStringInterner(final boolean isWeak){ - return isWeak ? createWeakInterner() : createJdkInterner(); + public static Intern of(final boolean isWeak){ + return isWeak ? ofWeak() : ofString(); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/intern/JdkStringInterner.java b/hutool-core/src/main/java/cn/hutool/core/lang/intern/StringIntern.java similarity index 80% rename from hutool-core/src/main/java/cn/hutool/core/lang/intern/JdkStringInterner.java rename to hutool-core/src/main/java/cn/hutool/core/lang/intern/StringIntern.java index be3106a32..283f0e24e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/intern/JdkStringInterner.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/intern/StringIntern.java @@ -6,7 +6,7 @@ package cn.hutool.core.lang.intern; * @author looly * @since 5.4.3 */ -public class JdkStringInterner implements Interner{ +public class StringIntern implements Intern { @Override public String intern(final String sample) { if(null == sample){ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakIntern.java b/hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakIntern.java new file mode 100755 index 000000000..67aab2025 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakIntern.java @@ -0,0 +1,30 @@ +package cn.hutool.core.lang.intern; + +import cn.hutool.core.map.WeakConcurrentMap; + +import java.lang.ref.WeakReference; + +/** + * 使用WeakHashMap(线程安全)存储对象的规范化对象,注意此对象需单例使用!
+ * + * @param key 类型 + * @author looly + * @since 5.4.3 + */ +public class WeakIntern implements Intern { + + private final WeakConcurrentMap> cache = new WeakConcurrentMap<>(); + + @Override + public T intern(final T sample) { + if(null == sample){ + return null; + } + T val; + // 循环避免刚创建就被回收的情况 + do { + val = this.cache.computeIfAbsent(sample, WeakReference::new).get(); + } while (val == null); + return val; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakInterner.java b/hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakInterner.java deleted file mode 100755 index dd0c0e322..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakInterner.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.hutool.core.lang.intern; - -import cn.hutool.core.map.WeakConcurrentMap; - -/** - * 使用WeakHashMap(线程安全)存储对象的规范化对象,注意此对象需单例使用!
- * - * @author looly - * @since 5.4.3 - */ -public class WeakInterner implements Interner{ - - private final WeakConcurrentMap cache = new WeakConcurrentMap<>(); - - @Override - public T intern(final T sample) { - if(null == sample){ - return null; - } - return cache.computeIfAbsent(sample, (key)->sample); - } -} diff --git a/hutool-core/src/test/java/cn/hutool/core/date/chinese/IssueI5YB1ATest.java b/hutool-core/src/test/java/cn/hutool/core/date/chinese/IssueI5YB1ATest.java new file mode 100755 index 000000000..347cd8588 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/date/chinese/IssueI5YB1ATest.java @@ -0,0 +1,13 @@ +package cn.hutool.core.date.chinese; + +import org.junit.Assert; +import org.junit.Test; + +public class IssueI5YB1ATest { + @Test + public void chineseDateTest() { + // 四月非闰月,因此isLeapMonth参数无效 + final ChineseDate date = new ChineseDate(2023, 4, 8, true); + Assert.assertEquals("2023-05-26 00:00:00", date.getGregorianDate().toString()); + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/intern/InternUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/intern/InternUtilTest.java index 826da2c48..4c6ab5c3c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/intern/InternUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/intern/InternUtilTest.java @@ -12,13 +12,13 @@ public class InternUtilTest { @SuppressWarnings("StringOperationCanBeSimplified") @Test public void weakTest(){ - final Interner interner = InternUtil.createWeakInterner(); + final Intern intern = InternUtil.ofWeak(); final String a1 = RandomUtil.randomString(RandomUtil.randomInt(100)); final String a2 = new String(a1); Assert.assertNotSame(a1, a2); - Assert.assertSame(interner.intern(a1), interner.intern(a2)); + Assert.assertSame(intern.intern(a1), intern.intern(a2)); } }