gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:21:50 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com