P362
Class.isInstance 可以实现动态判断类型, 避免使用大量 if else
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<Class<? extends Robot>,Integer> robotCounter = RobotCounter.countRobotList(robotList,list);
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<Class<? extends Robot>, Integer> {
public void count(Class<? extends Robot> type) {
Integer num = get(type);
if (null == num) {
put(type, 1);
} else {
put(type, num + 1);
}
}
}
public static HashMap<Class<? extends Robot>,Integer> countRobotList(List<Robot> robots,List<Class<? extends Robot>> types) {
Counter RobotCounter = new Counter();
for (Robot robot : robots) {
for (Class<? extends Robot> type: types){
type.isInstance(robot);
RobotCounter.count(type);
}
}
return RobotCounter;
}
}