假设我有一堂课,里面存储着武器库
public class Arsenal{
List<RocketLauncher> rocketLaunchers;
List<HandGrenade> handGrenades;
List<LandMine> landMines;
//Followed by a few more weapons
}
武器是枚举的一部分,武器
现在,我试图显示摘要屏幕或在其他地方报告,并且正在准备地图。请参见下面的代码段。我已经展示了两种方法
public Map<Weapon,Integer> generateReport(Arsenal arsenal){
Map<Weapon,Integer> weaponCountMap = //suitable map impl
//Technique 1
//Create and use a larger num of getters from the Arsenal Class
weaponCountMap.put(Weapon.HAND_GRENADE, arsenal.getHandGrenades);
//.. and so on
//Technique 2
//Create a single method in Arsenal which returns a Map
weaponCountMap = arsenal.getSummary();
return weaponCountMap;
}
问:难道只是我还是大家都感觉“不正确”使用了大量的干将。假设阿森纳可以储存约50种武器,就像该课程中的50种方法一样。与二传手一起加倍。
还。使用第二种方法(没有访问器方法)时,我感觉不太灵活。
你们能否请您认真评估这两种方法并可能提出新的方法?
不对您的武器类型进行硬编码Arsenal
怎么办?以下是针对您的特定情况的异构 容器的简单实现。但是,由于我对枚举中的泛型不太熟悉,因此需要在拥有Weapon
子类及其子类(例如)的情况下执行此实现HardGrenade extends Weapon
。
public class Arsenal{
private Map<Class<?>, Collection<?>> weaponArsenal;
public <T extends Weapon> Collection<T> get(Class<T> weaponClass) {
if (weaponArsenal.containsKey(weaponClass) {
return (Collection<T>) weaponArsenal.get(weaponClass);
}
return new ArrayList<T>(); // to avoid checking null everytime in client code
}
public <T extends Weapon> void put(T weapon) {
if (!weaponArsenal.containsKey(weapon.class)) {
Collection<T> weaponList = // initialize correct collection here
weaponArsenal.put(weapon.class, weaponList);
}
weaponArsenal.get(weapon.class).add(weapon);
}
}
并在客户端代码中
Arsenal arsenal = new Arsenal();
arsenal.put(new HandGrenade());
arsenal.put(new RocketLauncher());
Collection<HandGrenade> handGrenades = arsenal.get(HandGrenade.class);
Collection<RocketLauncher> rocketLaunchers = arsenal.get(RocketLauncher.class);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句