forked from destiny1020/algorithm_playground
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIntegerCache.java
More file actions
70 lines (53 loc) · 2.14 KB
/
IntegerCache.java
File metadata and controls
70 lines (53 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package misc;
import chap3.BST.IntegerWrapper;
/**
* 这个类来源于对于二叉树判定平衡算法中使用Integer作为“指针”时不能正常工作的探究
* @author Destiny
*
*/
public class IntegerCache {
public static void changeInteger(Integer source) {
source = source + 1;
}
public static Integer changeIntegerRet(Integer source) {
return (source + 1);
}
public static void changeIntegerWrapper(IntegerWrapper source) {
source.value = source.value + 1;
}
public static void changeIntegerWrapperImmutable(IntegerWrapperImmutable source) {
// source.value = source.value + 1;
source = source.add(1);
}
public static void main(String[] args) {
// 仅仅使用Integer,在一个方法中修改了zero的值,但是不返回最新的Ref值,打印错误的结果
Integer zero = 0;
changeInteger(zero);
System.out.println(zero);
System.out.println("--------------------------");
// 还是使用了Integer,但是这里使用了带有返回值的方法,更新了最新的Ref值,得到正确的结果
Integer zeroRet = 0;
zeroRet = changeIntegerRet(zeroRet);
System.out.println(zeroRet);
System.out.println("--------------------------");
// 使用Wrapper类,这里使用不带有返回值的方法,但是因为方法中不涉及对Ref值进行更新,得到正确的结果
IntegerWrapper zeroWrapper = new IntegerWrapper(0);
changeIntegerWrapper(zeroWrapper);
System.out.println(zeroWrapper.value);
System.out.println("--------------------------");
// 使用Wrapper Immutable类,使用不带有返回值的方法,由于方法中没有返回最新的Ref,得到错误的结果
IntegerWrapperImmutable zeroWrapperIm = new IntegerWrapperImmutable(0);
changeIntegerWrapperImmutable(zeroWrapperIm);
System.out.println(zeroWrapperIm.value);
}
// 如果把IntegerWrapper实现为Immutable Class会如何
public static final class IntegerWrapperImmutable {
public final int value;
public IntegerWrapperImmutable(int value) {
this.value = value;
}
public IntegerWrapperImmutable add(int operand) {
return new IntegerWrapperImmutable(operand + value);
}
}
}