Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果字段相同,则共享对象的单个实例_Java_Singleton - Fatal编程技术网

Java 如果字段相同,则共享对象的单个实例

Java 如果字段相同,则共享对象的单个实例,java,singleton,Java,Singleton,我熟悉静态变量和单例,但我没有看到关于这方面的任何信息: public class MyImmutableClass { private final String string; public static final MyImmutableClass getInstance(String s) { if( a MyImmutableClass already exists with that string as its field)

我熟悉静态变量和单例,但我没有看到关于这方面的任何信息:

public class MyImmutableClass {

    private final String string;

    public static final MyImmutableClass getInstance(String s) {

        if( a MyImmutableClass already exists with that string as its field)
            return (that instance);
        else
            return a new instance;

    }  

    ...

}  

MyImmutableClass的副本不可能存在。这有意义吗?如果有,您将如何实现这一点?

我认为您需要的是模式,而不是单例模式。在Java类中有很多这样的例子。例如,如果调用该方法,它可能正在执行类似的操作。如果您一次又一次地传入1,它每次都可能返回相同的整数对象

public final class MyImmutableClass {
private MyImmutableClass(){}
private final String string;
private static Map<String,MyImmutableClass> map = new WeakHashMap<String,MyImmutableClass>();
public static final MyImmutableClass getInstance(String s) {

    if(map.containsKey(s))
        return (map.get(s));
    else{
        MyImmutableClass temp = new MyImmutableClass(s);
        map.put(s,temp);
        return  temp;
    }
}  

...

}  

类似的东西应该适合您。

您需要保留一个包含可能重复使用的对象的集合。主要的复杂性是,如果这样做很幼稚,就会阻止垃圾收集

考虑使用WeakHashMap,以便可以自动删除引用

在您给定的情况下,您将把一个字符串映射到对象。

这称为

最简单的实现是:

实现hashCode和同意的等式 使用您的密钥到类的映射来确定您是否已经拥有一个并存储实例
你的伪代码就在那里。编写相应的Java,这就是问题所在。如果这样做有意义,我如何查看类的所有其他实例,以查看它们的字段是否与此字段匹配。您需要一个字典来注册实例,除非已经有方法扫描实例以查找名称。唉,我不知道在Java中是如何做到的。在C语言中,您可以将所有实例放在字典中,并按名称从字典中检索实例当前位置我已经阅读了他的书中的那一章我现在正在阅读这本书,事实上,他可能会涉及到这一点,但我不记得这个确切的场景。而且,这个链接几乎是完全不相关的。是的。只需将所有实例的一个映射以该唯一值作为键存储,然后构建一个新实例并将其存储在映射中,或者从映射中获取一个。我不同意t看起来更像是检索命名MyImmutableClass实例的注册过程。它不是工厂模式。@RobertHarvey我编辑了我的答案以添加更多细节。从某种意义上说,Integer.valueOf就是这样做的。请阅读Wikipedia对工厂模式的描述。它说定义一个用于创建对象的接口,但让这些类接口的实现决定了实例化哪个类。这根本不是这里发生的事情。它是完全相同对象的几个实例;这里没有关于实例化哪种类型的决策过程。我的观点是正确的。我应该说的是,你在寻找我将编辑我的答案的答案。谢谢,是吗更好地使用WeakHashMap?一种基于哈希表的映射实现,具有弱密钥。WeakHashMap中的条目将在其密钥不再正常使用时自动删除。更准确地说,给定密钥的映射的存在不会阻止该密钥被垃圾收集器丢弃,也就是说,使其成为可终结的、可终结的nd然后被回收。当一个键被丢弃时,它的条目将被有效地从映射中删除,因此该类的行为与其他映射实现有所不同。除非您打算保留对象直到故意从映射中删除,否则它应该是WeakHashMap。@Subin为什么不直接使用map.containsKeys;?@roundar请注意现在已经不是单身模式了。谢谢我投票给这个答案: