【问题标题】:Dice thrower with methods有方法的掷骰子
【发布时间】:2019-03-31 02:30:40
【问题描述】:

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

Edit* 我将随机生成器移到构造函数中,将 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之前调用getValue会发生什么?
  • @MadProgrammer 可以为currentRoll 设置任何默认值(null0),因为尚未掷骰子
  • 您可以将Random 作为构造函数参数并将其存储为实例变量。
  • @AndrewTobilko 并非如此,“die”没有“默认”值,因为它是原始值,所以不能是 null。通过随机化构造函数中的值,您可以克服“附加”状态规则的需要
  • 记住,这是一个练习。该练习要求您以特定方式完成给定的任务。在现实生活中,骰子的默认值是多少?通过随机化构造函数中的值,如果用户在roll 之前调用getValue,您将减少额外的状态规则或错误条件的需要。您可能还会发现后面的练习描述了“为什么”它避免直接从构造函数调用roll

标签: java class random methods constructor


【解决方案1】:

要求是构造函数和roll() 方法都选择一个随机值。他们做同样的事情。所以为了避免不必要的代码重复,构造函数可以调用roll方法等。

警告:在构造函数中调用可覆盖的方法是坏习惯This post explains 为什么会这样。

您的代码可能如下所示:

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;
    }
}

我不知道我是否完全同意这些要求,但既然它们是要求,你应该承认它们。

【讨论】:

    【解决方案2】:

    为什么要在构造函数中选择一个随机值?好吧,坦率地说,因为这是练习的要求。
    他们为什么有这个要求?如果我不得不猜测,那是为了模拟一个骰子总是有一些面朝上的事实(即,有一个值),无论你是否明确滚动它,但如果你想要一个明确的答案,你'必须询问这本书的作者他或她的想法。

    您可以通过在构造函数中调用roll 来实现。另外,请注意,您与已初始化但从未使用过的 value 成员存在冗余:

    public class Dice {
        private int currentRoll;
    
        //Constructor
        public Dice() {
            roll();
        }
    
        // methods...
    

    【讨论】:

    • 我同意,直到在构造函数中调用roll,但这可能超出了问题的范围;)
    • 我已经编辑了我的帖子,所以你可以看看我当前的代码。我知道值从未使用过,我应该完全删除它吗?
    • @Griezy 都不是。关键是,这是一个练习,你被要求以一种特定的方式进行,这会导致以后进行额外的练习。不要尝试过早优化解决方案,它们可能会引导您到某个地方;)
    • 请注意,在构造函数中调用可覆盖的方法是坏习惯See here why.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2015-04-30
    • 2012-11-29
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多