从有效的 Java 书中它指出“如果对象不可变,则它总是可以重用”。
String s = "shane";
String p = "shane";
此版本使用单个 String 实例
,而不是创建一个新的
每次执行。此外,保证对象将是
由在同一虚拟机中运行的任何其他代码重用,恰好包含
相同的字符串文字。
下面的最终类也是不可变的?点对象可以重复使用吗?
public final class Point {
private final int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y;
}
谁能给我提供一个上面的不可变类
的例子,它的对象/实例可以被重用吗?我只是对如何实现可重用性感到困惑?
我能够与 String
和 Integer
类相关联,但不能与用户定义的类相关联。
最佳答案
它“可以”被重用,因为您可以在多个地方使用同一个对象,这很好。但它不会,自动。 JVM 本身管理 -128 - 127 范围内的重用 Integer 对象
“实习生”字符串(包括文字)同样由 JVM 管理。此处最接近自动重用的方法是将构造函数设为私有(private),并创建一个工厂方法:
Point.create(int x, int y)
并让实现维护您想要重用的对象的缓存(例如整数有效缓存 -128 到 127)但是您必须自己完成这项工作。
编辑:
你基本上有:
private static final Map<Pair<Integer, Integer>, Point> cache = new HashMap<>();
public Point create(int x, int y) {
Pair<Integer, Integer> key = Pair.of(x, y);
if (cache.containsKey(key)) {
return cache.get(key);
}
Point p = new Point(x, y);
cache.put(key, p);
return p;
}
编辑: 或者,将 hashCode() 和 equals() 添加到 Point 类,然后只使用 HashSet。会更简单。
关于java - 所有不可变对象(immutable对象)都可以重用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18951517/