0

キー/コンテキスト/顧客ごとに 1 回だけインスタンスが存在するクラスを作成する必要があります。

問題と解決策を考えすぎているかどうかはわかりません。提案やガイダンスは非常に役立ちます。以下に、私がやろうとしていることの簡単な例を示します。

投稿を小さく保つために、インターフェイスと抽象クラスを削除しました。このコードをコンパイルできるはずです

初期化時間を使用して、2 つのインスタンスが同じか異なるかを調べていました。

基本クラス

package com.SomeCompany2.ps.stackOverflow.question;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CheckClass{
    protected String intializationTime;

    public CheckClass(){
        setIntializationTime();
    }

    private void setIntializationTime() {
        final Date date = new Date();
        final DateFormat formatter = new SimpleDateFormat("HH:mm:ss:SSS");
        this.intializationTime = formatter.format(date);
    }

    public String getIntializationTime(){
        return this.intializationTime;
    }

    public boolean isMatch(){
        return false;
    }
}

インスタンスが 1 つだけ存在することを確認するクラス ファクトリ。

package com.SomeCompany2.ps.stackOverflow.question;

import java.util.HashMap;
import java.util.Map;

public class CheckClassFactory{
    private CheckClassFactory(){}

    private static class CheckClassHolder   {
        private static final Map<String, CheckClass> mapping    = new HashMap<String, CheckClass>();

        private static CheckClass getInstance(final String key){
            if (!mapping.containsKey(key)){
                final CheckClass INSTANCE   = new CheckClass();
                mapping.put(key, INSTANCE);
            }
            return mapping.get(key);
        }

        public static void removeInstance(final String key){
            mapping.remove(key);
        }
    }

    public static CheckClass getInstance(final String key){
        return CheckClassHolder.getInstance(key);
    }

    public static void removeInstance(final String key){
        CheckClassHolder.removeInstance(key);
    }
}

私が考えている質問の 1 つは、「removeInstance」が呼び出されてインスタンスがマップから削除されると、インスタンスは破棄されるかということです。

また、このタスクを達成するためのより簡単な方法または既知のパターンはありますか?

4

1 に答える 1

1

これを改善する方法がいくつかあります。

[キー、インスタンス] のマップを維持するファクトリで十分ですmappingが、複数のスレッドがある場合は、アクセスを同期ブロックでラップすることをお勧めします。

それらが異なるかどうかを確認する必要はありませんinitializationTime。キーごとに 1 つのインスタンスしかないため、構築はファクトリによって制御されるため、デフォルトequals(または) をそのまま使用できます。==

于 2012-12-11T22:15:26.043 に答える