我自己实现的不可变类是否会节省内存?也就是说,如果两个引用需要引用相同的实例,即使有两个单独的尝试来分配对象,它们也将引用相同的实例。这是一个Java问题。
答案 0 :(得分:4)
不是不变的,但是你的设计使两个引用引用相同的实例是“节省”内存。不变性与该决定无关。
答案 1 :(得分:1)
首先:如果你没有告诉我们将它与之进行比较,很难判断它是否能节省内存。
一般来说:不,不是自动的。不可变类不会自动保存内存,它们甚至可能导致内存压力增加,因为每次想要更改内容时都需要实例化一个新内存。
话虽如此,你可以从中获得一些内存节省,如果你分享很多实例:因为它们是不可变的你可以避免做一个防御性拷贝只是使用它。 可以提高内存使用率。
总而言之:通常,不可变类本身不会使用更多或更少的内存。实际节省的是你如何使用它们。
答案 2 :(得分:0)
你是混乱的概念。类是不可变的这一事实并不意味着您将“重用”以前的对象。
例如,如果我这样做
ImmutableClass myImmu = new ImmutableClass(5);
ImmutableClass myImmu2 = new ImmutableClass(5);
我创建了两个不同的对象(即使它们的equals()实现返回true)。
另一件事是池化/缓存,在这里你保存一个创建的实例列表,而不是调用构造函数,你调用一个Factory方法,它可以获得一个以前缓存的实例。不可变类更易于池/缓存,因为它们的状态仅取决于构造函数,因此您确定它没有更改。
private static Map<Integer, InmutableClass> pool = ...
public static InmutableClass getInstance(int param) {
InmutableClass returnValue = pool.get(param);
if (returnValue == null) {
returnValue = new InmutableClass(param);
pool.put(param, returnValue);
}
return returnValue;
}
当然,如果您的实例很少被重用,那么您最终将使用此架构使用更多内存。