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.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;
|
||||||
|
@ -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,则返回的是同一个对象
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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){
|
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")
|
@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));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user