P360
Thinking in java的这几章艰涩难懂, 主要是结合展示了一些Class结合模板的示例, 实际运用中很少会用到
package com.cnsuning.src;
import java.util.*;
public class Main {
public static void main(String[] args) {
String[] RobotTypes = { "com.cnsuning.src.Robot",
"com.cnsuning.src.T100", "com.cnsuning.src.DolaAMen" };
List<Class<? extends Robot>> list = new ArrayList<Class<? extends Robot>>();
try {
for (String type : RobotTypes) {
list.add((Class<? extends Robot>) Class.forName(type));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
RobotMaker rm = new RobotMaker();
rm.setRobotTypes(list);
List<Robot> robotList = rm.makeRobots(10);
HashMap<String,Integer> robotCounter = RobotCounter.countRobotList(robotList);
System.out.println(robotList);
System.out.println(robotCounter);
}
}
class Robot {
public String toString() {
return "I'm robot";
}
}
class T100 extends Robot {
public String toString() {
return "I'm T100";
}
}
class DolaAMen extends Robot {
public String toString() {
return "I'm DolaAMen";
}
}
class RobotMaker {
private Random rand = new Random(47);
private List<Class<? extends Robot>> robotTypes;
public void setRobotTypes(List<Class<? extends Robot>> robotTypes) {
this.robotTypes = robotTypes;
}
public List<Robot> makeRobots(int num) {
List<Robot> robots = new ArrayList<Robot>();
for (int i = 0; i < num; i++) {
robots.add(getRandomType());
}
return robots;
}
private Robot getRandomType() {
int n = rand.nextInt(robotTypes.size());
try {
return robotTypes.get(n).newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}
class RobotCounter {
private static class Counter extends HashMap<String, Integer> {
public void count(String type) {
Integer num = get(type);
if (null == num) {
put(type, 1);
} else {
put(type, num + 1);
}
}
}
public static HashMap<String,Integer> countRobotList(List<Robot> robots) {
Counter RobotCounter = new Counter();
for (Robot robot : robots) {
if (robot instanceof T100){
RobotCounter.count("T100");
}
else if (robot instanceof DolaAMen){
RobotCounter.count("DolaAMen");
}
else if(robot instanceof Robot){
RobotCounter.count("Robot");
}
}
return RobotCounter;
}
}
对书中代码稍作简化编写了以上测试代码, 结果为:
[I'm DolaAMen, I'm DolaAMen, I'm T100, I'm DolaAMen, I'm T100, I'm DolaAMen, I'm T100, I'm DolaAMen, I'm robot, I'm T100]
{Robot=1, T100=4, DolaAMen=5}
比较奇特的是类似List<? extends Robot> list = new ArrayList<? extends Robot>();的写法会报编译错误, 而List<Class<? extends Robot>>就不会, 继承向的模板限定只能用于Class???
此外, 统计随机生成类型数目利用了instance of 的类型检查以及内部类, 使用内部类可以很容易地特异化整合已有的容器类等, 实现特定功能.
利用Class的动态类型判断可以避免使用大量if else 请参见 点击打开链接