如何为类设置默认对象参数,使参数依赖其他参数无需单独方法
解决方案:让派生参数自动保持最新值
你的核心需求是让points这个参数基于wins和draws自动计算,不需要每次手动调用方法更新。原来的代码只在构造时计算了一次初始值,后续修改wins或draws时没有同步更新points,所以始终是初始值。下面提供两种可行方案:
方案1:用Getter实时计算(推荐)
不需要把points作为成员变量存储,每次获取时直接基于当前的wins和draws计算,这样永远是最新值,完全避免状态不同步问题:
public class FootballTeams { private String name; private int gamesQuant = 0; private int wins = 0; private int draws = 0; private int looses = 0; public FootballTeams(String name) { this.name = name; } // 实时计算并返回points,无需单独存储 public int getPoints() { return wins * 3 + draws; } // 给wins、draws提供setter,修改后getPoints会自动返回新值 public void setWins(int wins) { this.wins = wins; } public void setDraws(int draws) { this.draws = draws; } // 其他必要的getter/setter public String getName() { return name; } public int getGamesQuant() { return gamesQuant; } public void setGamesQuant(int gamesQuant) { this.gamesQuant = gamesQuant; } public int getLooses() { return looses; } public void setLooses(int looses) { this.looses = looses; } }
方案2:存储points并在依赖项变化时自动更新
如果必须把points作为成员变量存储,可以封装一个私有更新方法,在构造函数和所有修改wins、draws的地方调用它:
public class FootballTeams { private String name; private int gamesQuant = 0; private int wins = 0; private int draws = 0; private int looses = 0; private int points; public FootballTeams(String name) { this.name = name; updatePoints(); // 初始化时计算初始值 } // 私有方法,负责更新points private void updatePoints() { points = wins * 3 + draws; } // 修改wins后立即更新points public void setWins(int wins) { this.wins = wins; updatePoints(); } // 修改draws后立即更新points public void setDraws(int draws) { this.draws = draws; updatePoints(); } // 比如新增胜利场次的方法,也要同步更新points public void addWin() { wins++; updatePoints(); } public int getPoints() { return points; } // 其他getter/setter省略 }
原代码问题分析
你之前的setPoints方法只在构造函数里调用了一次,后续修改wins或draws时没有触发重新计算,所以points一直停留在初始的0值。上面的方案要么去掉存储直接计算,要么确保每次依赖项变化时都更新points,解决了这个问题。
内容的提问来源于stack exchange,提问作者Sergii Buchynskyi
相关产品推荐
相关产品推荐

