本文详解如何为 Assignment 类设计健壮、边界安全的 accrueScore() mutator 方法,涵盖输入校验、极值动态维护、累加统计与计数更新,并提供可直接运行的 Java 实现及关键注意事项。
本文详解如何为 `assignment` 类设计健壮、边界安全的 `accruescore()` mutator 方法,涵盖输入校验、极值动态维护、累加统计与计数更新,并提供可直接运行的 java 实现及关键注意事项。
在面向对象编程中,mutator(修改器)方法用于安全地变更对象内部状态。针对成绩管理场景,Assignment 类需准确记录每次提交的成绩,并实时维护最小分、最大分、总分和有效成绩数量——这正是 accrueScore(int newScore) 的核心职责。
以下为完整、经过逻辑验证的实现:
public class Assignment {
private String name;
private int totalPoints;
private int minScore;
private int maxScore;
private int sum;
private int count;
public Assignment(String inName, int inTotalPoints) {
this.name = inName;
this.totalPoints = inTotalPoints;
// 初始化为非法值(如 Integer.MAX_VALUE / MIN_VALUE)更利于首次比较,
// 但此处按题设要求初始化为 0;后续逻辑通过 count == 0 判断首分,故可行
this.minScore = 0;
this.maxScore = 0;
this.sum = 0;
this.count = 0;
}
/**
* 将新成绩计入本作业,仅当成绩合法时更新内部状态。
* 合法条件:0 ≤ newScore ≤ totalPoints
* @param newScore 待添加的成绩
*/
public void accrueScore(int newScore) {
// 步骤1:范围校验 —— 超出 [0, totalPoints] 的成绩被静默忽略
if (newScore totalPoints) {
return; // 不执行任何更新
}
// 步骤2:首次录入 —— 直接设为 min 和 max
if (count == 0) {
minScore = newScore;
maxScore = newScore;
} else {
// 步骤3 & 4:动态更新极值(无需 else-if,因 min/max 可能同时更新)
if (newScore > maxScore) {
maxScore = newScore;
}
if (newScore <p>✅ <strong>关键设计说明与注意事项:</strong> </p>
- 边界安全优先:方法开头即进行 0 ≤ newScore ≤ totalPoints 校验,非法输入不引发异常,而是静默跳过——符合题干“do nothing”要求,也提升系统鲁棒性。
- 首次录入的原子性处理:利用 count == 0 作为唯一判断依据,避免对 minScore/maxScore 初始值(如 0)产生歧义(例如若所有成绩均为 0,初始值将无法区分“未录入”与“已录入零分”)。
- 极值更新无耦合:min 和 max 的更新是独立判断的,允许单次调用同时刷新两者(如录入第一个成绩时),逻辑清晰且高效。
- 返回类型选择:题干中方法声明为 public int accrueScore(...),但实际无需返回值。强烈建议改为 void —— 这是 Java mutator 方法的标准实践;若需反馈(如成功/失败),应抛出异常或返回布尔值,而非整型。
- 扩展建议:生产代码中可增加 Objects.requireNonNull(name) 校验、支持浮点成绩(double)、添加日志或事件通知机制,以及单元测试覆盖边界用例(如 accrueScore(-1)、accrueScore(101) 当 totalPoints=100)。
通过此实现,Assignment 类具备了专业级的成绩聚合能力,为构建完整 Gradebook 系统奠定了坚实基础。










