
本文讲解如何设计 dice 类,使其在构造时保存面数(sides),后续调用 rolldie() 时自动使用该内部状态,避免每次手动传参,提升代码简洁性与封装性。
本文讲解如何设计 dice 类,使其在构造时保存面数(sides),后续调用 rolldie() 时自动使用该内部状态,避免每次手动传参,提升代码简洁性与封装性。
在面向对象编程中,良好的封装意味着将数据(状态)与行为(方法)绑定在对象内部,并让方法默认依赖对象自身的属性,而非反复要求外部提供冗余参数。您当前的 Dice 类已正确将 sides 作为实例变量保存,但 rollDie(int sides) 方法仍强制要求传入面数——这违背了封装初衷,也削弱了对象的自治性。
要解决这个问题,只需为 Dice 类添加一个无参重载方法 rollDie(),它内部直接调用原有逻辑,并传入 this.sides:
// Dice.java
import java.util.Random;
public class Dice {
private final int sides; // 推荐使用 final,确保面数不可变
public Dice(int sides) {
if (sides <p>同时,更新主程序以体现改进效果:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill9868" title="Java注释规范Skills"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20dbae7c507.jpg" alt="Java注释规范Skills" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill9868" title="Java注释规范Skills" class="overflowclass">Java注释规范Skills</a>
<p class="overflowclass">当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。</p>
</div>
<a rel="nofollow" href="/xiazai/skill9868" title="Java注释规范Skills" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><pre class="brush:php;toolbar:false;">// 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()); // ✅ 无需传参,输出 1–6 的随机整数
System.out.println("Another roll: " + d6.rollDie()); // 再次调用,结果独立
}
}✅ 关键改进点说明:
- rollDie() 无参方法完全隐藏了 sides 的传递细节,调用者只需关注“掷骰子”这一行为;
- 原有 rollDie(int sides) 方法仍可保留(例如用于调试或临时规则变更),但日常使用推荐无参版本;
- 将 sides 声明为 private final 更符合面向对象设计原则——一旦创建,面数不可更改,避免意外状态污染;
- Random 实例建议提升为类成员(尤其在高频调用场景下),但单次调用中局部创建亦可接受;此处为简洁未重构,实际项目中可优化为 private static final Random RANDOM = new Random();。
⚠️ 注意:random.nextInt(sides + 1) + 1 在原代码中会导致范围错误(如 sides=6 时可能返回 7)。已修正为 random.nextInt(sides) + 1,确保结果严格落在 [1, sides] 区间内。
通过这一设计,Dice 对象真正成为“有记忆、有行为”的实体——它知道自己有多少面,并能自主完成掷骰动作。这才是面向对象封装价值的直观体现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










