This commit is contained in:
Looly 2022-11-10 10:37:54 +08:00
parent b7d91489f4
commit c69d41e72d
8 changed files with 62 additions and 41 deletions

View File

@ -6,11 +6,6 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeUtil; import cn.hutool.core.date.TimeUtil;
import cn.hutool.core.date.Zodiac; 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 cn.hutool.core.text.StrUtil;
import java.time.LocalDate; import java.time.LocalDate;
@ -140,7 +135,12 @@ public class ChineseDate {
* @param isLeapMonth 当前月份是否闰月 * @param isLeapMonth 当前月份是否闰月
* @since 5.7.18 * @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; this.day = chineseDay;
// 当月是闰月的后边的月定义为闰月如润的是五月则5表示五月6表示润五月 // 当月是闰月的后边的月定义为闰月如润的是五月则5表示五月6表示润五月
this.isLeapMonth = isLeapMonth; this.isLeapMonth = isLeapMonth;

View File

@ -9,7 +9,7 @@ package cn.hutool.core.lang.intern;
* @author looly * @author looly
* @since 5.4.3 * @since 5.4.3
*/ */
public interface Interner<T> { public interface Intern<T> {
/** /**
* 返回指定对象对应的规范化对象sample对象可能有多个但是这些对象如果都equals则返回的是同一个对象 * 返回指定对象对应的规范化对象sample对象可能有多个但是这些对象如果都equals则返回的是同一个对象

View File

@ -12,29 +12,29 @@ public class InternUtil {
* 创建WeakHshMap实现的字符串规范化器 * 创建WeakHshMap实现的字符串规范化器
* *
* @param <T> 规范对象的类型 * @param <T> 规范对象的类型
* @return {@link Interner} * @return {@link Intern}
*/ */
public static <T> Interner<T> createWeakInterner(){ public static <T> Intern<T> ofWeak(){
return new WeakInterner<>(); return new WeakIntern<>();
} }
/** /**
* 创建JDK默认实现的字符串规范化器 * 创建JDK默认实现的字符串规范化器
* *
* @return {@link Interner} * @return {@link Intern}
* @see String#intern() * @see String#intern()
*/ */
public static Interner<String> createJdkInterner(){ public static Intern<String> ofString(){
return new JdkStringInterner(); return new StringIntern();
} }
/** /**
* 创建字符串规范化器 * 创建字符串规范化器
* *
* @param isWeak 是否创建使用WeakHashMap实现的Interner * @param isWeak 是否创建使用WeakHashMap实现的Interner
* @return {@link Interner} * @return {@link Intern}
*/ */
public static Interner<String> createStringInterner(final boolean isWeak){ public static Intern<String> of(final boolean isWeak){
return isWeak ? createWeakInterner() : createJdkInterner(); return isWeak ? ofWeak() : ofString();
} }
} }

View File

@ -6,7 +6,7 @@ package cn.hutool.core.lang.intern;
* @author looly * @author looly
* @since 5.4.3 * @since 5.4.3
*/ */
public class JdkStringInterner implements Interner<String>{ public class StringIntern implements Intern<String> {
@Override @Override
public String intern(final String sample) { public String intern(final String sample) {
if(null == sample){ if(null == sample){

View File

@ -0,0 +1,30 @@
package cn.hutool.core.lang.intern;
import cn.hutool.core.map.WeakConcurrentMap;
import java.lang.ref.WeakReference;
/**
* 使用WeakHashMap(线程安全)存储对象的规范化对象注意此对象需单例使用<br>
*
* @param <T> key 类型
* @author looly
* @since 5.4.3
*/
public class WeakIntern<T> implements Intern<T> {
private final WeakConcurrentMap<T, WeakReference<T>> 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;
}
}

View File

@ -1,22 +0,0 @@
package cn.hutool.core.lang.intern;
import cn.hutool.core.map.WeakConcurrentMap;
/**
* 使用WeakHashMap(线程安全)存储对象的规范化对象注意此对象需单例使用<br>
*
* @author looly
* @since 5.4.3
*/
public class WeakInterner<T> implements Interner<T>{
private final WeakConcurrentMap<T, T> cache = new WeakConcurrentMap<>();
@Override
public T intern(final T sample) {
if(null == sample){
return null;
}
return cache.computeIfAbsent(sample, (key)->sample);
}
}

View File

@ -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());
}
}

View File

@ -12,13 +12,13 @@ public class InternUtilTest {
@SuppressWarnings("StringOperationCanBeSimplified") @SuppressWarnings("StringOperationCanBeSimplified")
@Test @Test
public void weakTest(){ public void weakTest(){
final Interner<String> interner = InternUtil.createWeakInterner(); final Intern<String> intern = InternUtil.ofWeak();
final String a1 = RandomUtil.randomString(RandomUtil.randomInt(100)); final String a1 = RandomUtil.randomString(RandomUtil.randomInt(100));
final String a2 = new String(a1); final String a2 = new String(a1);
Assert.assertNotSame(a1, a2); Assert.assertNotSame(a1, a2);
Assert.assertSame(interner.intern(a1), interner.intern(a2)); Assert.assertSame(intern.intern(a1), intern.intern(a2));
} }
} }