mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix bug
This commit is contained in:
parent
b7d91489f4
commit
c69d41e72d
@ -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;
|
||||
|
@ -9,7 +9,7 @@ package cn.hutool.core.lang.intern;
|
||||
* @author looly
|
||||
* @since 5.4.3
|
||||
*/
|
||||
public interface Interner<T> {
|
||||
public interface Intern<T> {
|
||||
|
||||
/**
|
||||
* 返回指定对象对应的规范化对象,sample对象可能有多个,但是这些对象如果都equals,则返回的是同一个对象
|
@ -12,29 +12,29 @@ public class InternUtil {
|
||||
* 创建WeakHshMap实现的字符串规范化器
|
||||
*
|
||||
* @param <T> 规范对象的类型
|
||||
* @return {@link Interner}
|
||||
* @return {@link Intern}
|
||||
*/
|
||||
public static <T> Interner<T> createWeakInterner(){
|
||||
return new WeakInterner<>();
|
||||
public static <T> Intern<T> ofWeak(){
|
||||
return new WeakIntern<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建JDK默认实现的字符串规范化器
|
||||
*
|
||||
* @return {@link Interner}
|
||||
* @return {@link Intern}
|
||||
* @see String#intern()
|
||||
*/
|
||||
public static Interner<String> createJdkInterner(){
|
||||
return new JdkStringInterner();
|
||||
public static Intern<String> ofString(){
|
||||
return new StringIntern();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建字符串规范化器
|
||||
*
|
||||
* @param isWeak 是否创建使用WeakHashMap实现的Interner
|
||||
* @return {@link Interner}
|
||||
* @return {@link Intern}
|
||||
*/
|
||||
public static Interner<String> createStringInterner(final boolean isWeak){
|
||||
return isWeak ? createWeakInterner() : createJdkInterner();
|
||||
public static Intern<String> of(final boolean isWeak){
|
||||
return isWeak ? ofWeak() : ofString();
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ package cn.hutool.core.lang.intern;
|
||||
* @author looly
|
||||
* @since 5.4.3
|
||||
*/
|
||||
public class JdkStringInterner implements Interner<String>{
|
||||
public class StringIntern implements Intern<String> {
|
||||
@Override
|
||||
public String intern(final String sample) {
|
||||
if(null == sample){
|
30
hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakIntern.java
Executable file
30
hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakIntern.java
Executable 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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
13
hutool-core/src/test/java/cn/hutool/core/date/chinese/IssueI5YB1ATest.java
Executable file
13
hutool-core/src/test/java/cn/hutool/core/date/chinese/IssueI5YB1ATest.java
Executable 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());
|
||||
}
|
||||
}
|
@ -12,13 +12,13 @@ public class InternUtilTest {
|
||||
@SuppressWarnings("StringOperationCanBeSimplified")
|
||||
@Test
|
||||
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 a2 = new String(a1);
|
||||
|
||||
Assert.assertNotSame(a1, a2);
|
||||
|
||||
Assert.assertSame(interner.intern(a1), interner.intern(a2));
|
||||
Assert.assertSame(intern.intern(a1), intern.intern(a2));
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user