所有不可变对象都可以重用吗?

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,它的对象/实例可以重复使用吗?我只是对可重用性如何发生感到困惑?

我能够StringIntegerClasses 相关联,但不能与用户定义的类相关联.

Jam*_*mes 11

它可以"重复使用",因为你可以在多个地方使用同一个对象,这样就可以了.但它不会自动发生.JVM本身管理重用Integer对象的范围为-128 - 127

Java中的整数缓存

"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.会更简单.

  • +1.JVM中不可变对象的小规模缓存的其他示例包括`BigDecimal.ZERO` /`ONE` /`TEN`,`Collections.EMPTY_LIST` /`EMPTY_SET` /`EMPTY_MAP`和`Boolean.TRUE` /` FALSE`.常见的因素是没有尝试缓存*all*值,也没有尝试缓存*force*缓存,而只是为了简化在单个程序中可能多次使用的一些值的共享. (2认同)