java - 所有不可变对象(immutable对象)都可以重用吗?

标签 java oop immutability value-objects

从有效的 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;
 }

谁能给我提供一个上面的不可变类的例子,它的对象/实例可以被重用吗?我只是对如何实现可重用性感到困惑?

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

最佳答案

它“可以”被重用,因为您可以在多个地方使用同一个对象,这很好。但它不会,自动。 JVM 本身管理 -128 - 127 范围内的重用 Integer 对象

Integers caching in Java

“实习生”字符串(包括文字)同样由 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/

相关文章:

java - 字符串基本查询

java - @Entity 无法识别@MappedSuperclass 中的@Id

java - 如何在 Java 中比较字符串?

java - 将具有相同元素和属性名称的 XML 映射到 Java 对象

JavaScript游戏——无法跨越的物体

matlab - 未定义函数 'addListener'

java - C 和 OOP 需要一点澄清

c++ - C# 的 readonly 字段修饰符的 C++ 等价物是什么?

java - 我怎样才能阻止程序第二次跳过我的检查?

database - 我应该用不可变或可变数据结构表示数据库数据吗?