有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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的副本不可能存在。这有意义吗?如果有,您将如何实现这一点


共 (4) 个答案

  1. # 1 楼答案

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

    考虑使用弱哈希映射,以便可以自动删除引用。

    在您给定的情况下,您需要将字符串映射到对象

  2. # 2 楼答案

    我想你要找的是Static Factory模式,而不是单例模式。在Java类中有很多这样的例子。例如,如果调用方法Integer.valueOf(myString);,它可能会执行类似的操作。如果反复传入“1”,则每次都可能返回相同的整数对象

  3. # 3 楼答案

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

    像这样的东西应该适合你

  4. # 4 楼答案

    这被称为flyweight pattern

    最简单的实现是:

    • 实现hashCode()和equals(),两者一致
    • 使用您的密钥到类的映射来确定您是否已经拥有一个并存储实例