0

我需要创建一个类,其实例每个键/上下文/客户仅存在一次。

我不知道我是否过度思考问题和解决方案。任何建议或指导都会非常有帮助。下面显示的是我正在尝试做的一个简化示例。

为了使帖子保持较小,我删除了接口和抽象类。您应该能够编译此代码

我正在使用初始化时间来查找两个实例是相同还是不同。

基类

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;
    }
}

确保只存在一个实例的类工厂。

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);
    }
}

我确实想到的问题之一是,当调用“removeInstance”并将实例从地图中删除时,实例会被销毁吗?

还有一种更简单的方法或已知的模式来完成这项任务吗?

4

1 回答 1

1

有几种方法可以改进。

您的工厂维护 [key, instance] 的映射就足够了,但mapping如果您有多个线程,您可能希望将访问包装在同步块中。

您不需要initializationTime查看它们是否不同 - 因为每个键只有一个实例,您可以使用默认值equals(或==),因为构造由工厂控制。

于 2012-12-11T22:15:26.043 回答