Java 掷骰子的方法
我目前正在做一些学习手册中的练习,其中一个任务是:写一个骰子类“dice”,它的值在1-6之间。还应该有一个选择随机值的构造函数和一个也选择随机值的roll()方法。还应创建getValue()方法,该方法将用于检索显示的值。为此程序编写一个测试类 编辑*我将随机化器向上移动到构造函数,将roll方法保留为空。当构造函数已经随机化时,我应该在roll()方法中做什么 这是我目前的代码:Java 掷骰子的方法,java,class,random,methods,constructor,Java,Class,Random,Methods,Constructor,我目前正在做一些学习手册中的练习,其中一个任务是:写一个骰子类“dice”,它的值在1-6之间。还应该有一个选择随机值的构造函数和一个也选择随机值的roll()方法。还应创建getValue()方法,该方法将用于检索显示的值。为此程序编写一个测试类 编辑*我将随机化器向上移动到构造函数,将roll方法保留为空。当构造函数已经随机化时,我应该在roll()方法中做什么 这是我目前的代码: public class Dice { int value; int currentRoll
public class Dice {
int value;
int currentRoll;
public Dice() {
Random rand = new Random();
this.value = 1;
this.currentRoll = rand.nextInt(6) + 1;
}
public int roll() {
Random rand = new Random();
this.currentRoll = rand.nextInt(6) + 1;
return this.currentRoll;
}
public int getValue() {
return this.currentRoll;
}
}
我不明白的是:为什么要在构造函数和roll()方法中随机分配值?还有,我遗漏了什么?为什么要在构造函数中选择一个随机值?坦白说,因为这是练习的要求。
他们为什么有这个要求?如果我不得不猜测,这是为了模拟这样一个事实,一个骰子总是有一些正面(即,有一个值),无论你是否明确地滚动它,但如果你想要一个明确的答案,你必须问这本书的作者他或她有什么想法 您可以通过在构造函数中调用
roll
来实现这一点。另外,请注意,值与已初始化但从未使用的成员之间存在冗余:
public class Dice {
private int currentRoll;
//Constructor
public Dice() {
roll();
}
// methods...
要求构造函数和roll()
方法都选择一个随机值。他们做同样的事情。因此,为了避免不必要的代码重复,构造函数可以调用roll方法
注意:在构造函数中调用可重写的方法是一种坏习惯。这是为什么
您的代码可能如下所示:
class Dice {
private int value;
// You could create the Random instance here once, instead of everytime
// recreating it
private Random r = new Random();
public Dice() {
roll();
}
// You could also change the return type to and int and return this.value
public final void roll() {
this.value = this.r.nextInt(6) + 1;
}
public int getValue() {
return this.value;
}
}
我不知道我是否完全同意这些要求,但既然它们是要求,你应该承认它们。如果在调用roll
之前调用getValue
会发生什么情况?@MadProgrammer可以有任何默认值(null
或0
)对于currentRoll
,由于骰子尚未掷过,您可以将Random
作为构造函数参数传递,并将其作为实例变量存储。@andreTobilko实际上,“die”没有“default”值,并且由于它是一个原语,因此不能null
。通过在构造函数中随机化值,您可以克服“附加”状态规则Remember的需要,这是一个练习。本练习要求您以特定的方式完成给定的任务。在现实生活中,模具的默认值是什么?通过将构造函数中的值随机化,如果用户在roll
之前调用getValue
,则减少了对附加状态规则或错误条件的需要。您可能还会发现,练习后面描述了“为什么”它避免直接从构造函数调用roll
,我同意,直到调用构造函数中的roll
,但这是一个吹毛求疵的问题,可能超出了问题的范围;)我已经编辑了我的帖子,所以你可以看看我当前的代码。价值从未被使用过我知道,我应该完全移除它吗?@Griezy None的掷骰。重点是,这是一个练习,你被要求以一种特定的方式来进行,这会导致以后的额外练习。不要试图提前优化解决方案,它们可能会把您带到某些地方;)请注意,在构造函数中调用可重写的方法是一个坏习惯。