2

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

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

8 回答 8

3

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

于 2010-10-19T18:58:52.077 回答
2

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

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

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

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

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

问:为什么要使用 MAX?

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

首先,它使代码更易于阅读。如果我正在阅读您的代码并且看到value <= 6了 6,我会对 6 的实际含义感到困惑。如果我看到 DICE_MAX_VALUE 之类的东西,那么我确切地知道你在检查什么。

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

于 2010-10-19T19:05:21.437 回答
2

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

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

于 2010-10-19T18:58:39.877 回答
1

简单地

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

因为默认值集将是 0 。在您的逻辑中这是不可取的。

//为什么我们使用 MAX 而不是数字 6?

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

于 2010-10-19T19:02:34.060 回答
1

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

于 2010-10-19T19:00:30.963 回答
1

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

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

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

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

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

于 2010-10-19T19:23:25.730 回答
1

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

作为旁注,问题代码中的格式可以使用一些工作来提高可读性。

于 2010-10-19T18:57:45.370 回答
1
//why do you set the faceValue as 1?

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

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

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

于 2010-10-19T18:57:56.403 回答