Sha*_*ane 4 java oop immutability value-objects
从有效的Java书中可以看出," 如果一个对象是不可变的,那么它总是可以被重用 ".
String s = "shane";
String p = "shane";
Run Code Online (Sandbox Code Playgroud)
此版本使用a single String instance,而不是每次执行时都创建一个新版本.此外,保证对象将被在同一虚拟机中运行的任何其他代码重用,这些代码恰好包含相同的字符串文字.
下面的最终课程也是不可改变的呢?点对象可以重复使用吗?
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;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供一个上面的例子immutable class,它的对象/实例可以重复使用吗?我只是对可重用性如何发生感到困惑?
我能够String与IntegerClasses 相关联,但不能与用户定义的类相关联.
Jam*_*mes 11
它可以"重复使用",因为你可以在多个地方使用同一个对象,这样就可以了.但它不会自动发生.JVM本身管理重用Integer对象的范围为-128 - 127
"intern"ed字符串(包括文字)类似地由JVM管理.您可以在此处使用最接近自动重用的方法是将构造函数设为私有,并创建工厂方法:
Point.create(int x, int y)
Run Code Online (Sandbox Code Playgroud)
并且让实现维护你想要重用的对象的缓存(比如整数有效地缓存-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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:或者,将hashCode()和equals()添加到Point类,并使用HashSet.会更简单.