Java 掷骰子的方法

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

我目前正在做一些学习手册中的练习,其中一个任务是:写一个骰子类“dice”,它的值在1-6之间。还应该有一个选择随机值的构造函数和一个也选择随机值的roll()方法。还应创建getValue()方法,该方法将用于检索显示的值。为此程序编写一个测试类

编辑*我将随机化器向上移动到构造函数,将roll方法保留为空。当构造函数已经随机化时,我应该在roll()方法中做什么

这是我目前的代码:

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的掷骰。重点是,这是一个练习,你被要求以一种特定的方式来进行,这会导致以后的额外练习。不要试图提前优化解决方案,它们可能会把您带到某些地方;)请注意,在构造函数中调用可重写的方法是一个坏习惯。