我需要创建一个类,其每个键/ context / customer只存在一次实例。
我不知道我是否在思考问题和解决方案。任何建议或指导都将非常有帮助。 下面显示的是我想要做的简化示例。
为了保持帖子小,我删除了界面和抽象类。您应该能够编译此代码
我正在使用初始化时间来查找两个实例是相同还是不同。
基类
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”并从地图中删除实例时,实例是否会被销毁?
还有更简单的方法或知道模式来完成这项任务吗?
答案 0 :(得分:1)
有几种方法可以改进。
您的工厂维护[key,instance]的映射应该已经足够了,但如果您有多个线程,您可能希望将mapping
访问包装在同步块中。
您不应该initializationTime
查看它们是否不同 - 因为每个键只有一个实例,您可以使用默认的equals
(或==
),因为施工由工厂控制。