0

我有一个名为 Token 的类,它用new Token(String). 因为 Token 类在实例化时会生成一个随机数,所以每个 String 输入只有一个 Token 实例很重要。为了保证这种行为,我想在尝试创建重复实例时返回原始实例指针。

这可能吗?

4

2 回答 2

2

创建一个TokenFactory具有Map<String, Token>数据成员的类。在您的 create 方法中,如果您StringMap. 如果没有,请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;
        }
    }
}
于 2013-02-20T23:04:30.587 回答
1

如果您的 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 )。

于 2013-02-20T23:12:10.467 回答