gpt4 book ai didi

java - 比使用大量 setter/getter 更好的方法/设计

转载 作者:行者123 更新时间:2023-12-01 07:23:34 27 4
gpt4 key购买 nike

假设我有一个存储武器阿森纳的类(class)

public class Arsenal{

List<RocketLauncher> rocketLaunchers;
List<HandGrenade> handGrenades;
List<LandMine> landMines;
//Followed by a few more weapons

}

武器是枚举 Weapon 的一部分

现在,我正在尝试在其他地方显示摘要屏幕或报告,并且正在准备 map 。请参阅下面的片段。我已经展示了两种方法

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;
}

问题:是只有我一个人还是每个人都觉得使用大量 setter/getter “不对”。假设阿森纳存储了大约 50 件武器,那么类中有 50 种方法。双人与二传手。

还有。我觉得使用第二种方法不太灵活,因为没有访问器方法。

你们能批判性地评估这两种方法并可能提出新的方法吗?

最佳答案

不要在你的军械库中硬编码武器类型怎么样?下面是heterogeneous的简单实现container针对您的具体情况。但是,由于我不太熟悉枚举中的泛型,因此当您拥有 Weapon 及其子类时,例如HardGrenade 扩展了 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);

关于java - 比使用大量 setter/getter 更好的方法/设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30046421/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com