繁体   English   中英

Java setter,getter(滚动模具)

[英]Java setter, getter (rolling a die)

我有一些关于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;
   }
}

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

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

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

问:为什么要使用吸气剂和二传手?

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

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

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

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

问:为什么要使用MAX?

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

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

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

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

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

//why do you set the faceValue as 1?

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

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

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

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

只是

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM