Home

软件构造实验六

字数统计: 627阅读时长: 2 min
2019/06/06 Share

第一次更认真的重写hashCode。按照更好的重写hashCode方法


零散知识

Int最大数

 It is universally accepted that 在int范围中最大的数为2147483647.在本人设计Ladder这个ADT时,需要记录该梯子上所有猴子中速度最小的,记为这个梯子的最小数。但是应该确保的是,初始化时这个梯子最小速度应该为一个非常非常大的数,即为int范围最大值。
 我本人这样写this.minSpeed = 2147483647;
 后来查询到,Java中由Integer.MAX_VALUE表示。不得不叹上一句“这java封装的太好了”。

随机方向和随机速度

emsp;查阅可知,可以利用Java封装好的随机正整数生成器。

1
2
3
4
5
6
7
8
private Direction randomDirection() {
Random ran = new Random();
int dirNumber = ran.nextInt(2); // Random number for [0,1]
if (dirNumber == 0) {
return Direction.LtoR; //If the number is 0, the direction is "LtoR".
}
return Direction.RtoL; // Else, the direction is "RtoL"
}

静态变量初始化???

 本人的思路是这样的,在生成一个LadderGenerator,生成public的一个List<Ladder>,然后大家对这个Ladders操作即可。我设置这个List为静态变量。

1
2
3
4
5
6
7
8
9
10
11
12
/**
* This is the Ladder generator which produces many Ladders.
*/
public class Ladders {
public static List<Ladder> ladders = new ArrayList<Ladder>();

public static void getLadders(int n) {
for (int i = 1;i <= n; i++) {
ladders.add(new Ladder(i));
}
}
}

 在测试时,出了问题

1
2
3
Ladder l1 = ladders.get(0);
Ladder l2 = ladders.get(1);
Ladder l3 = ladders.get(2);

这时对l1或者其他梯子修改属性,再调用strategy接口中的方法时,会按照未被修改属性的梯子来操作。
并且在该方法中测试l1属性,显示修改过的。但是在具体策略类的方法中就会表现不同?
目前猜测原因:

  1. 类被加载的时候,普通方法加载到方法区,静态方法和静态字段加载到方法区中的静态区
  2. 首先静态字段会进行默认初始化。
  3. 然后静态字段会进行显示初始化。

其中,这个例子很好的演示了这个出人意料的情况的由来。

 此外,又学了一招。以往需要访问一个静态变量的时候,需要用[类名].(变量) 的方式访问,比如Client.manyLadders,而采用静态导入包的方式可以直接访问该包内的静态成员变量。
比如:

1
2
import static run.Client.manyLadders;
import static run.Client.logger;

本知识点来自于static关键字的四种应用


CATALOG
  1. 1. 零散知识
    1. 1.1. Int最大数
    2. 1.2. 随机方向和随机速度
    3. 1.3. 静态变量初始化???