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

时间:2013-01-04 05:33:53

标签: 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)
            return (that instance);
        else
            return a new instance;

    }  

    ...

}  

不存在MyImmutableClass的重复项。这是否有意义,如果是这样,你将如何实现这一点?

4 个答案:

答案 0 :(得分:2)

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

...

}  

这样的事情对你有用。

答案 1 :(得分:1)

我认为你要找的是Static Factory模式,而不是Singleton模式。 Java类本身有很多这方面的例子。例如,如果您调用方法Integer.valueOf(myString);,则可能会做类似的事情。如果一遍又一遍地传入“1”,则每次都可能返回相同的Integer对象。

答案 2 :(得分:1)

这称为flyweight pattern

最简单的实现是:

  • 实现hashCode()和equals()同意
  • 使用您的密钥映射到您的班级,以确定您是否已有一个并存储实例

答案 3 :(得分:0)

你需要保持,例如包含可能重用的对象的集合。主要的复杂因素是,如果它天真地完成,你就可以防止垃圾收集。

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

在您给出的情况下,您可以将String映射到对象。