我有一个名为 Token 的类,它用new Token(String)
. 因为 Token 类在实例化时会生成一个随机数,所以每个 String 输入只有一个 Token 实例很重要。为了保证这种行为,我想在尝试创建重复实例时返回原始实例指针。
这可能吗?
我有一个名为 Token 的类,它用new Token(String)
. 因为 Token 类在实例化时会生成一个随机数,所以每个 String 输入只有一个 Token 实例很重要。为了保证这种行为,我想在尝试创建重复实例时返回原始实例指针。
这可能吗?
创建一个TokenFactory
具有Map<String, Token>
数据成员的类。在您的 create 方法中,如果您String
在Map
. 如果没有,请Map
在返回之前将其添加到。
如果您想阻止用户Token
自己创建实例,您必须尝试将构造函数设为私有并制作TokenFactory
静态内部类,就像Builder
模式一样。
public class TokenFactory {
private static final Map<String, Token> INSTANCES = new ConcurrentHashMap<String, Token>();
public Token create(String key) {
if (INSTANCES.containsKey(key) {
return INSTANCES.get(key);
} else {
Token t = new Token(key);
INSTANCES.put(key, t);
return t;
}
}
}
如果您的 Token 类是不可变的,您可以考虑使用Google Guava 的Interner。从javadoc:
为彼此相等的任何实例集合选择并返回代表实例。如果为此方法提供了两个相等的输入,则两个调用都将返回相同的实例。也就是说,intern(a).equals(a) 始终成立,并且当且仅当 a.equals(b) 时,intern(a) == intern(b)。请注意,如果原始实习实例被垃圾回收,则允许 intern(a) 现在返回一个实例,稍后返回另一个实例。
例如
Interner<Token> tokenInterner = Interners.newStrongInterner();
Token token = tokenInterner.intern(new Token("String"));
将确保始终为相同的 String 值返回相同的 Token 实例(假设您正确实现了 equals )。