
本文讲解如何设计 dice 类,使其在创建时初始化面数,并在后续调用 rolldie() 时不需重复传入 sides 参数,真正实现“状态封装”与“行为解耦”。
本文讲解如何设计 dice 类,使其在创建时初始化面数,并在后续调用 rolldie() 时不需重复传入 sides 参数,真正实现“状态封装”与“行为解耦”。
在面向对象编程中,一个核心原则是:对象应自主管理其状态,并基于该状态提供简洁、语义清晰的行为接口。你当前的 Dice 类虽已将 sides 存储为实例变量,但 rollDie(int sides) 方法仍强制要求外部重复传参,这不仅违背封装性,也增加了调用负担和出错风险(例如误传错误面数)。
正确的做法是提供两个重载版本的 rollDie() 方法:
- 一个带参版本(保留兼容性或特殊用途);
- 一个无参版本,直接复用对象内部已初始化的 sides 值。
以下是优化后的完整代码:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
// Dice.java
import java.util.Random;
public class Dice {
private final int sides; // 使用 final 保证不可变性(推荐)
public Dice(int sides) {
if (sides < 1) {
throw new IllegalArgumentException("Dice must have at least 1 side.");
}
this.sides = sides;
}
// 无参方法:自动使用对象自身的 sides 属性
public int rollDie() {
return rollDie(this.sides);
}
// 带参方法(可选):支持临时覆盖面数(如模拟特殊骰子)
public int rollDie(int sides) {
if (sides < 1) {
throw new IllegalArgumentException("Sides must be positive.");
}
Random random = new Random();
// nextInt(n) 返回 [0, n), 所以 +1 得到 [1, n]
return random.nextInt(sides) + 1;
}
}// Main.java
public class Main {
public static void main(String[] args) {
Dice d6 = new Dice(6);
System.out.println("Number of sides: " + d6.sides); // 输出: 6
System.out.println("Roll result: " + d6.rollDie()); // ✅ 简洁调用,无需传参
System.out.println("Another roll: " + d6.rollDie()); // 再次调用同样简洁
}
}⚠️ 关键改进说明:
立即学习“Java免费学习笔记(深入)”;
- sides 声明为 private final,确保对象构建后不可篡改,提升安全性与可预测性;
- 修正了 Random.nextInt(sides + 1) + 1 的逻辑错误:原写法可能生成 sides + 1(超出范围),正确应为 random.nextInt(sides) + 1,确保结果严格落在 [1, sides] 区间;
- 无参 rollDie() 方法通过 this.sides 直接复用内部状态,彻底消除冗余参数;
- 异常校验增强健壮性,防止非法构造或调用。
✅ 总结:封装不是仅把字段放进类里,而是让行为自然依赖于状态。通过方法重载+内部状态引用,你的 Dice 对象真正做到了“知其所是,行其所能”——创建即配置,调用即生效。

















