でインスタンス化するTokenというクラスがありますnew Token(String)
。Tokenクラスはインスタンス化時に乱数を生成するため、文字列入力ごとに1つのTokenインスタンスのみが存在することが重要です。このような動作を保証するために、重複したインスタンスを作成しようとしたときに元のインスタンスポインタを返したいと思います。
これは可能ですか?
でインスタンス化するTokenというクラスがありますnew Token(String)
。Tokenクラスはインスタンス化時に乱数を生成するため、文字列入力ごとに1つのTokenインスタンスのみが存在することが重要です。このような動作を保証するために、重複したインスタンスを作成しようとしたときに元のインスタンスポインタを返したいと思います。
これは可能ですか?
データメンバーTokenFactory
を持つクラスを作成します。createメソッドで、がキーとしてMap<String, Token>
見つかった場合は、値を返します。そうでない場合は、戻る前に追加してください。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 から:
互いに等しいインスタンスのコレクションの代表インスタンスを選択して返します。このメソッドに 2 つの等しい入力が与えられた場合、両方の呼び出しで同じインスタンスが返されます。つまり、 intern(a).equals(a) は常に成立し、 intern(a) == intern(b) は、a.equals(b) の場合に限ります。元のインターンされたインスタンスがガベージコレクションされた場合、 intern(a) は現在 1 つのインスタンスを返し、後で別のインスタンスを返すことが許可されていることに注意してください。
例えば
Interner<Token> tokenInterner = Interners.newStrongInterner();
Token token = tokenInterner.intern(new Token("String"));
同じ String 値に対して同じ Token インスタンスが常に返されるようにします (equals を正しく実装していると仮定します)。