【发布时间】:2013-02-22 21:36:39
【问题描述】:
This Java tutorial 表示不可变对象在创建后无法更改其状态。
java.lang.String 有一个字段
/** Cache the hash code for the string */
private int hash; // Default to 0
在第一次调用hashCode()方法时初始化,所以创建后会发生变化:
String s = new String(new char[] {' '});
Field hash = s.getClass().getDeclaredField("hash");
hash.setAccessible(true);
System.out.println(hash.get(s));
s.hashCode();
System.out.println(hash.get(s));
输出
0
32
调用String不可变对吗?
【问题讨论】:
-
反射黑客不计入不变性。
-
正如@Perception 所说,反射黑客不应该算在内。私有字段中哈希值的缓存不会影响任何非私有方法或状态。
-
我的一生都是个谎言!
-
通过类似的技巧,您可以将所有值为 0 的整数神奇地变为 1。将零称为零仍然正确吗?
标签: java immutability