gpt4 book ai didi

java - 如何为每个键/上下文/客户创建对象的单个实例?

转载 作者:行者123 更新时间:2023-12-01 14:59:50 25 4
gpt4 key购买 nike

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

我不知道我是否想太多问题和解决方案。任何建议或指导都会非常有帮助。下面显示的是我正在尝试做的事情的简化示例。

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

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

基类

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”并将实例从 map 中删除时,该实例会被销毁吗?

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

最佳答案

有几种方法可以改进这一点。

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

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

关于java - 如何为每个键/上下文/客户创建对象的单个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com