-1

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

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

4 回答 4

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

...

}  

像这样的东西应该适合你。

于 2013-01-04T05:40:00.833 回答
1

我认为您正在寻找的是静态工厂模式,而不是单例模式。Java 类本身就有很多这样的例子。例如,如果您调用方法Integer.valueOf(myString); 可能正在做类似的事情。如果你一遍又一遍地传入“1”,它可能每次都返回相同的 Integer 对象。

于 2013-01-04T05:36:56.517 回答
1

这称为享元模式

最简单的实现是:

  • 实现同意的 hashCode() 和 equals()
  • 使用您班级的密钥 Map 来确定您是否已经拥有一个并存储实例
于 2013-01-04T05:40:52.887 回答
0

例如,您需要保留一个包含您可能重用的对象的集合。主要的复杂性是,如果它天真地完成,您将阻止垃圾收集。

考虑使用 Wea​​kHashMap 以便可以自动删除您的引用。

在您提供的情况下,您会将 String 映射到对象。

于 2013-01-04T05:40:17.757 回答