Java setter, getter (бросая кубик) - PullRequest
2 голосов
/ 19 октября 2010

У меня есть несколько вопросов о 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 ]

3 голосов
/ 19 октября 2010

Прежде всего, вы должны правильно использовать тег кода примера, это ужасно читать. Использование методов getter / setter предотвратит прямой доступ к переменной экземпляра. Это также называется скрытием или инкапсуляцией данных. Что касается ваших вопросов, faceValue инициализируется значением 1, вы обычно выполняете инициализацию в конструкторе. Второй вопрос Math.random сгенерирует число от 0 до 1, умножив его на 6, что приведет к числу от 0 до 5. Таким образом, вы добавляете +1, чтобы иметь диапазон 1-6.

2 голосов
/ 19 октября 2010

В: Зачем использовать геттеры и сеттеры?

A: Использование их в сочетании с частными переменными экземпляра позволяет вам точно определить, как следует изменять значение поля.Это может стать утомительным, потому что большую часть времени получатели и установщики просто получат / установят значение без каких-либо проверок или побочных эффектов.Но даже здесь, в вашем коде, вы видите, как установщик faceValue проверяет, находится ли заданное значение между 0 и MAX.Это гарантирует, что когда кто-либо, включая вас, захочет изменить faceValue, входные данные будут проверены.

Это называется инкапсуляцией, где вы скрываете поля класса от всего, что находится за пределами этого класса, и определяете очень конкретные способы того, какизменить get и манипулировать этими полями.

Q: Почему для faceValue установлено значение 1?

A: Это просто инициализирует faceValue равным 1. Так что если вы вызываете getValue без предварительного броска кубика,всегда возвращайте 1. Это может быть что угодно.

Q: Зачем использовать MAX?

A: Это очень хорошая практика программирования - использовать константы для любой константы в вашем коде.

Прежде всего, это облегчает чтение кода.Если бы я читал твой код и увидел value <= 6, я бы не понял, что такое 6 на самом деле.Если я видел что-то вроде DICE_MAX_VALUE, то я точно знаю, что вы проверяли.

Во-вторых, возможно, что еще важнее, использование констант позволяет вам определить его один раз, использовать его где угодно и гарантировать одинаковое значение.Если вы когда-нибудь хотели изменить это на кубик с 20-ю гранями, вам нужно было бы зайти в свой код и изменить все экземпляры с «6» на «20», что может быть раздражающим, трудоемким и подверженным ошибкам.

2 голосов
/ 19 октября 2010

Вы используете константу («MAX»), потому что в некоторых случаях вы можете захотеть изменить значение, например, если вы хотите бросить двадцатигранную кость.В этом случае вам нужно всего лишь изменить код в одной строке, что облегчает поддержку.Это не имеет особого смысла в этой простой программе, но в более сложных проектах вы хотите использовать константы для быстрого изменения определенных (фиксированных) значений без проверки каждой строки.

Методы Getter и Setterиспользуется в объектно-ориентированном программировании для инкапсуляции переменных и обеспечения интерфейса, обеспечивающего доступ к этим переменным для других классов

1 голос
/ 19 октября 2010

Этот пример прямо из учебника, который я использовал в университете. Вы в программе Райерсона 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 в одной области, а не везде менять 6 на 8.

1 голос
/ 19 октября 2010

Просто

// почему вы устанавливаете faceValue как 1?

, поскольку значение по умолчанию будет равно 0. Это нежелательно в вашей логике, поэтому,

// Почему мы используем МАКС вместо числа 6?

Всегда лучше использовать постоянные значения в качестве открытого статического конечного поля

1 голос
/ 19 октября 2010

Итак, это то, что мы называем классом данных. Это означает, что этот класс используется для представления данных, которые передаются по вашей программе, в данном случае это данные для матрицы. Getters / Setters, если все сделано правильно, позволяют вам получить доступ к этим данным и изменить значения, создавая классы данных, как это полезно при создании кратных значений, так что в вашем случае, если вы только что объявили эти переменные в основном классе, было бы очень трудно и неудобно таким образом создали несколько штампов, хотя вы можете создать несколько экземпляров штампов. Поскольку значение facevalue равно 1, я предполагаю, что это потому, что значение реального кубика никогда не равно 0, поэтому поэтому установка на единицу является значением по умолчанию перед броском. на самом деле это может быть любое значение, поскольку все они имеют одинаковую вероятность. Вы используете max, потому что его всегда будет 6, и таким образом он не может быть изменен никакими другими методами по ошибке. надеюсь, это поможет +1 Хороший вопрос для начинающих Спасибо Крис

1 голос
/ 19 октября 2010
//why do you set the faceValue as 1?

В Java целые числа по умолчанию установлены в 0, но в кости нет лица, имеющего значение 0.

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

MAX используется, так что всякий раз, когда вы хотите обновить значениеMAX, вы обновляете его в одном месте.И он будет обновляться везде, где вы его использовали.Таким образом, становится легко поддерживать и приспосабливать изменения.

1 голос
/ 19 октября 2010

Установка faceValue назначает разумный бросок кубика при инициализации, не завися от вызова roll(). Использование MAX вместо 6 облегчает изменение размера кубика - например, во многих других играх используются кубики разных размеров, и, возможно, вы захотите перенести на них этот код.

В качестве примечания, форматирование в коде вопроса может потребовать немного усилий для улучшения читабельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...