Java setter,getter(滚动模具)

时间:2010-10-19 18:52:57

标签: java random setter getter dice

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

8 个答案:

答案 0 :(得分:3)

首先,您应该正确使用代码示例标记,这很丑陋。使用getter / setter方法将阻止直接访问实例变量。这也称为数据隐藏或封装。至于你的问题,faceValue用值1进行初始化,你在构造函数中做了初始化。第二个问题Math.random将生成一个0-1之间的数字,你将它与6相乘,得到一个介于0和5之间的数字。所以你加+1来得到1-6的范围。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

答:将它们与私有实例变量结合使用,可以准确定义字段值的更改方式。它可能变得单调乏味,因为大多数时候,吸气剂和制定者只会得到/设定值而不需要任何检查或副作用。但即使在你的代码中,你也会看到faceValue的setter如何检查给定的值是否介于0和MAX之间。当包括你自己在内的任何人想要改变faceValue时,这个guarentees,将检查输入。

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

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

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

问:为什么要使用MAX?

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

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

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

答案 3 :(得分:1)

设置faceValue在初始化时分配合理的掷骰,而不依赖于对roll()的调用。使用MAX代替6可以更容易地更改芯片尺寸 - 例如,许多其他游戏使用不同的芯片尺寸,并且您可能希望将此代码移植到它们。

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

答案 4 :(得分:1)

//why do you set the faceValue as 1?

在Java中,默认情况下整数设置为0,但在骰子中没有face有0值。

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

使用MAX,因此无论何时想要更新MAX的值,都要在一个地方更新它。它会在您使用它的地方得到更新。通过这种方式,可以轻松维护和适应变化。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

简单

  

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

因为默认值设置为0。因此在您的逻辑中不可取。

  

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

将常量值用作公共静态最终字段

总是更好的做法

答案 7 :(得分:1)

这个例子直接来自我在大学里使用的教科书。你在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。