【发布时间】:2012-06-10 17:39:30
【问题描述】:
考虑两个调用静态工厂方法 valueOf 的 Integer 类型的引用,如下所示:-
Integer a = Integer.valueOf("10");
Integer b = Integer.valueOf("10");
考虑到 Integer 是不可变的,是否可以使用 == 而不是使用 equals 方法比较 a 和 b。我猜 valueOf 方法确保只创建一个值为 10 的 Integer 实例,并为每个创建的值为 10 的 Integer 返回对该实例的引用。
一般来说,比较一个不可变类的两个引用是否可以通过使用 == 而不是 equals 来调用相同的静态工厂方法创建的?
编辑: Integer 类仅用作示例。我知道如果使用 == 进行比较,最多 127 的整数将返回 true。我需要知道的是,当我创建自己的不可变类时,例如使用方法 create() 的 MyImmutable,该方法将确保不会创建重复的 MyImmutable 对象,如果我比较使用 create 方法创建的 2 个 MyImmutable 引用是否可以使用 == 而不是等于。
【问题讨论】:
-
请阅读this
-
不变性只是意味着它们不能改变。需要特别注意缓存(没有
new),以确保为相同的输入参数返回相同的值。 -
您可以使用
==代替 equals 用于未覆盖 equals 的类型。由于这在未来可能会发生变化,因此 equals 几乎总是更好。我唯一会说==更好的是使用enum之类的类型,它可能是null,在这种情况下使用==可以简化代码。 -
使用 == over equals 可以提高性能。如果不可变类中的方法保证它返回的引用使得 a.equals(b) 仅在 a == b 时为真,那么我看不出应该避免 == 的原因。
标签: java equals immutability