【问题标题】:Java setter, getter (rolling a die)Java setter、getter(掷骰子)
【发布时间】:2011-04-27 15:56:53
【问题描述】:

我有一些关于 java 的问题。代码中有两个问题(我将它们保留为 cmets)。 另外使用设置和获取方法的目的是什么?你能不能简单地解释一下。我是初学者。谢谢你:)

public class Die
{
   private final int MAX = 6;  
   private int faceValue;  

   public Die()
   {
      faceValue = 1;

      //why do you set the faceValue as 1?
   }

   public int roll()
   {
      faceValue = (int)(Math.random() * MAX) + 1;
      //Why do we use MAX instead of just number 6?

      return faceValue;
   }

   public void setFaceValue (int value)
   {
      if (value > 0 && value <= MAX)
         faceValue = value;
   }

   public int getFaceValue()
   {
      return faceValue;
   }

   public String toString()
   {
      String result = Integer.toString(faceValue);
      return result;
   }
}

【问题讨论】:

  • 下次请正确格式化您的代码。使用底部的预览确保它看起来不错。
  • 抱歉,格式错误。我会确保我正确编码。并感谢大家的帮助。您的所有回答都非常有帮助!

标签: java random setter getter dice


【解决方案1】:

首先你应该正确使用代码示例标签,这样读起来很难看。使用 getter/setter 方法将阻止对实例变量的直接访问。这也称为数据隐藏或封装。至于你的问题,faceValue 用值 1 初始化,你通常在构造函数中做初始化的事情。第二个问题 Math.random 将生成一个介于 0-1 之间的数字,您将其乘以 6,得到一个介于 0 和 5 之间的数字。因此,您添加 +1 以得到 1-6 的范围。

【讨论】:

    【解决方案2】:

    您使用常量(“MAX”)是因为在某些情况下您可能想要更改值,例如,如果您想要掷 20 面骰子。在这种情况下,您只需要在一行中更改代码,这样更易​​于维护。在这种简单的程序中没有多大意义,但在更复杂的项目中,您希望使用常量来快速更改某些(固定)值,而无需检查每一行。

    Getter 和 Setter 方法在面向对象的编程中用于保持变量被封装并提供接口以使这些变量可以被其他类访问

    【讨论】:

      【解决方案3】:

      问:为什么要使用 getter 和 setter?

      答:将它们与私有实例变量结合使用可以让您准确定义如何更改字段的值。这可能会变得乏味,因为大多数时候,getter 和 setter 只会获取/设置值而没有任何检查或副作用。但即使在您的代码中,您也可以看到 faceValue 的设置器如何检查给定的值是否在 0 和 MAX 之间。这保证了当任何人(包括您自己)想要更改 faceValue 时,都会检查输入。

      这称为封装,您可以将类的字段隐藏在该类之外的所有内容中,并定义非常具体的方法来更改获取和操作这些字段。

      问:为什么将 faceValue 设置为 1?

      答:这只是将 faceValue 初始化为 1。因此,如果您在没有先掷骰子的情况下调用 getValue,它将始终返回 1。它可以是您想要的任何值。

      问:为什么要使用 MAX?

      答:对代码中的任何常量使用常量是一种非常好的编程习惯。

      首先,它使代码更易于阅读。如果我在阅读您的代码并看到value &lt;= 6,我会对 6 到底是什么感到困惑。如果我看到 DICE_MAX_VALUE 之类的东西,那么我确切地知道你在检查什么。

      其次,也许更重要的是,使用常量可以让您定义一次并在任何地方使用它,并保证具有相同的值。如果您想将其更改为 20 面骰子,则必须进入您的代码并将所有“6”实例更改为“20”,这可能很烦人、耗时且容易出错。

      【讨论】:

        【解决方案4】:

        设置faceValue 是在初始化时分配一个合理的掷骰子,而不依赖于对roll() 的调用。使用MAX 而不是 6 可以更轻松地更改骰子大小 - 例如,许多其他游戏使用不同的骰子大小,也许您想将此代码移植到它们。

        附带说明一下,问题代码中的格式可能需要做一些工作来提高可读性。

        【讨论】:

          【解决方案5】:

          所以这就是我们所说的 Data 类,这意味着这个类用于表示在您的程序周围发送的数据,在这种情况下,它是骰子的数据。 Getters/Setters 如果正确完成,则允许您访问此数据并更改值,创建这样的数据类在创建倍数时很有用,因此在您的情况下,如果您只是在主类中声明这些变量,那将是非常困难和错误的尽管您可以创建多个 die 实例,但以这种方式创建了多个 die。 至于面值为 1,我认为这是因为真正骰子的值永远不会为 0,因此设置为 1 是掷骰前的默认值。它可以是任何值,因为它们都有相似的概率。 您使用 max 是因为它总是 6,这样它就不会被任何其他方法错误地更改。 希望有帮助 +1 适合初学者的好问题 谢谢克里斯

          【讨论】:

            【解决方案6】:

            简单

            //为什么要设置faceValue为1?

            因为默认值设置为 0 。在您的逻辑中不希望如此设置。

            //为什么我们使用MAX而不是仅仅 6号?

            使用常量值作为公共静态最终字段总是更好的做法

            【讨论】:

              【解决方案7】:
              //why do you set the faceValue as 1?
              

              在 Java 中,整数默认设置为 0,但在 dice 中没有面值是 0。

              //Why do we use MAX instead of just number 6?
              

              使用了MAX,所以每当你想更新MAX的值时,你就在一个地方更新它。它会在您使用过它的地方得到更新。通过这种方式,维护和适应变化变得容易。

              【讨论】:

                【解决方案8】:

                这个例子直接来自我在大学使用的一本教科书。您在 Ryerson 的 ITM 计划中吗?

                请记住,物理骰子会掷出 1 和 6 之间的任何值。请考虑以下几点:

                public class Monopoly
                {
                  public static void main(String[] args)
                  {
                     Die myDie = new Die();
                     System.out.println(myDie.getFaceValue());
                  }
                }
                

                如果你的构造函数没有初始化 facevalue,你认为会发生什么?

                使用 MAX 而不是 6 与代码可读性有关。在一个大程序中,你可以把 6 放在任何地方。这对你来说很好,因为你写了它,但是两年后来取代你的开发人员会到处看到这些 6,并且可能不明白你为什么使用数字 6。通过使用常量(MAX)并使用那个词,您正在为正在发生的事情添加更多上下文。其次,如果游戏规则更改为使用从 1 到 8 的骰子,则在一个区域更新 MAX = 8 比在任何地方将 6s 更改为 8s 更容易。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-09-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-02-29
                  • 2015-06-26
                  相关资源
                  最近更新 更多