mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
add Intern
This commit is contained in:
parent
d8e7cdde79
commit
667dbc2be7
@ -3,7 +3,7 @@
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
|
||||
# 5.4.3 (2020-09-15)
|
||||
# 5.4.3 (2020-09-16)
|
||||
|
||||
### 新特性
|
||||
* 【core 】 使用静态的of方法来new对象(pr#177@Gitee)
|
||||
@ -15,6 +15,7 @@
|
||||
* 【core 】 增加Generator
|
||||
* 【db 】 Column增加是否主键、保留位数等字段
|
||||
* 【cache 】 Cache接口增加get重载(issue#1080@Github)
|
||||
* 【core 】 增加Interner和InternUtil(issue#I1TU1Y@Gitee)
|
||||
|
||||
### Bug修复
|
||||
* 【core 】 修复Dict.of错误(issue#I1UUO5@Gitee)
|
||||
|
@ -0,0 +1,40 @@
|
||||
package cn.hutool.core.lang.intern;
|
||||
|
||||
/**
|
||||
* 规范化对象生成工具
|
||||
*
|
||||
* @author looly
|
||||
* @since 5.4.3
|
||||
*/
|
||||
public class InternUtil {
|
||||
|
||||
/**
|
||||
* 创建WeakHshMap实现的字符串规范化器
|
||||
*
|
||||
* @param <T> 规范对象的类型
|
||||
* @return {@link Interner}
|
||||
*/
|
||||
public static <T> Interner<T> createWeakInterner(){
|
||||
return new WeakInterner<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建JDK默认实现的字符串规范化器
|
||||
*
|
||||
* @return {@link Interner}
|
||||
* @see String#intern()
|
||||
*/
|
||||
public static Interner<String> createJdkInterner(){
|
||||
return new JdkStringInterner();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建字符串规范化器
|
||||
*
|
||||
* @param isWeak 是否创建使用WeakHashMap实现的Interner
|
||||
* @return {@link Interner}
|
||||
*/
|
||||
public static Interner<String> createStringInterner(boolean isWeak){
|
||||
return isWeak ? createWeakInterner() : createJdkInterner();
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package cn.hutool.core.lang.intern;
|
||||
|
||||
/**
|
||||
* 规范化表示形式封装<br>
|
||||
* 所谓规范化,即当两个对象equals时,规范化的对象则可以实现==<br>
|
||||
* 此包中的相关封装类似于 {@link String#intern()}
|
||||
*
|
||||
* @param <T> 规范化的对象类型
|
||||
* @author looly
|
||||
* @since 5.4.3
|
||||
*/
|
||||
public interface Interner<T> {
|
||||
|
||||
/**
|
||||
* 返回指定对象对应的规范化对象,sample对象可能有多个,但是这些对象如果都equals,则返回的是同一个对象
|
||||
*
|
||||
* @param sample 对象
|
||||
* @return 样例对象
|
||||
*/
|
||||
T intern(T sample);
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package cn.hutool.core.lang.intern;
|
||||
|
||||
/**
|
||||
* JDK中默认的字符串规范化实现
|
||||
*
|
||||
* @author looly
|
||||
* @since 5.4.3
|
||||
*/
|
||||
public class JdkStringInterner implements Interner<String>{
|
||||
@Override
|
||||
public String intern(String sample) {
|
||||
if(null == sample){
|
||||
return null;
|
||||
}
|
||||
return sample.intern();
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package cn.hutool.core.lang.intern;
|
||||
|
||||
import cn.hutool.core.lang.SimpleCache;
|
||||
|
||||
/**
|
||||
* 使用WeakHashMap(线程安全)存储对象的规范化对象,注意此对象需单例使用!<br>
|
||||
*
|
||||
* @author looly
|
||||
* @since 5.4.3
|
||||
*/
|
||||
public class WeakInterner<T> implements Interner<T>{
|
||||
|
||||
private final SimpleCache<T, T> cache = new SimpleCache<>();
|
||||
|
||||
@Override
|
||||
public T intern(T sample) {
|
||||
if(null == sample){
|
||||
return null;
|
||||
}
|
||||
return cache.get(sample, ()->sample);
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* 规范化表示形式封装<br>
|
||||
* 所谓规范化,即当两个对象equals时,规范化的对象则可以实现==<br>
|
||||
* 此包中的相关封装类似于 String#intern()
|
||||
*
|
||||
* @author looly
|
||||
*/
|
||||
package cn.hutool.core.lang.intern;
|
@ -0,0 +1,24 @@
|
||||
package cn.hutool.core.lang.intern;
|
||||
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class InternUtilTest {
|
||||
|
||||
/**
|
||||
* 检查规范字符串是否相同
|
||||
*/
|
||||
@SuppressWarnings("StringOperationCanBeSimplified")
|
||||
@Test
|
||||
public void weakTest(){
|
||||
final Interner<String> interner = InternUtil.createWeakInterner();
|
||||
String a1 = RandomUtil.randomString(RandomUtil.randomInt(100));
|
||||
String a2 = new String(a1);
|
||||
|
||||
Assert.assertNotSame(a1, a2);
|
||||
|
||||
Assert.assertSame(interner.intern(a1), interner.intern(a2));
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user