我正在尝试编写一些Java类来为棒球队建模。一支球队有一个球员名单,这些球员要么是投手,要么是位置球员。每种类型的播放器都有一些独特的方法,如此UML图所示。

我正在尝试实现Team.calcPitchingStats()方法。此方法需要检查花名册上每个Pitcher的统计信息。
这是我目前的解决方案。我不确定这种做法有多好,或者它是否被认为是干净的代码,但它是有效的。我不是百分之百的计算,但我不知道什么是棒球。这是整个函数。
public String calcPitchingStats(){
int count = 0;
int totInnings = 0;
int totEarnedRuns = 0;
double totEarnedRunAvg = 0.0;
double totWhip = 0.0;
for(Map.Entry<Integer, Player> player : roster.entrySet()){
if(player.getValue().getClass() == Pitcher.class){
Pitcher pitcher = (Pitcher) player.getValue();
totInnings += pitcher.getInningsPitched();
totEarnedRuns += pitcher.getEarnedRuns();
totEarnedRunAvg += pitcher.getEarnedRunAverage();
totWhip += pitcher.getWhip();
count++;
}
}
totEarnedRunAvg = totEarnedRunAvg / count;
totWhip = totWhip / count;
return "Total Innings: " + totInnings + " Total Earned Runs: " +
totEarnedRuns + " Total Earned Run Average: " + totEarnedRunAvg
+ " Total Whip: " + totWhip;
}我想知道是否有一种方法可以通过TreeMap使用instanceof来访问扩展类的函数。可能是Java泛型?我一直在理论上,可能一个模板可以工作?但是,由于被覆盖的调用toString()方法,程序知道它们不是Pitcher就是PositionPlayer。只是好奇如何以最少的处理访问这些其他方法,而不是使用instanceof。
发布于 2021-04-18 11:41:14
虽然您的解决方案有效,但在面向对象的代码中进行显式类型检查或向下转换(从父类型转换为子类型)通常表明您的设计存在问题。
在这种情况下,您可能希望更改Team存储球员列表的方式。您可以添加Pitcher和PositionPlayer的单独集合,而不是(或附加于)通用投手对象的花名册。这样,在calcPitchingStats()方法中,您可以在不进行任何强制转换或类型检查的情况下迭代遍历投手的集合。
如果您不能修改Team API,而必须处理Player对象的集合,那么我建议您使用instanceof而不是getClass(),因为它更清晰,而且可以正确地处理子类。
https://stackoverflow.com/questions/67140685
复制相似问题