Java - методы Get / Set, получающие и возвращающие «ноль» - PullRequest
8 голосов
/ 04 июня 2011

Я новичок в Java. В целях обучения я пытаюсь создать себе приложение для игры в шахматы. В моем классе Case, который будет использоваться для создания экземпляров всех 64 корпусов моей доски, я пишу методы get / set, чтобы определить, есть ли в экземплярах корпуса обитатель Piece.

Я прочитал, что возвращать «ноль» - это плохая практика, поэтому вместо этого я выбрасываю исключение, чтобы показать, что случай свободен. Но мне интересно, как установить указатель пассажира на «ноль»; Могу ли я просто нажать «ноль» в качестве параметра, когда я вызову этот метод?

Кроме того, может ли принятие / возврат «ноль» быть приемлемой / хорошей практикой?

public Piece getOccupant(){
    if (this.occupant == null)
        throw new IllegalArgumentException(this.occupant + " is Empty");
    return this.occupant;
}
public void setOccupant(Piece newOccupant){
    this.occupant = newOccupant;
}

Спасибо!

[Обновление]

Спасибо всем за ваши комментарии, идеи, исправления и рекомендации. Вот обновленная версия моего кода для этой части, и я чувствую себя довольным этим, поскольку он выполнил свою задачу (улучшите мое понимание с помощью практики).

/*
 * Modifiers of Occupant
 */
/**
 * Used to find if a Piece is located in this Cell
 * @return a Piece reference to the occupant.  Will send a 
 * null pointer if cell is empty
 */
public Piece getOccupant(){
    return this.occupant;
}
/**
 * Used to set a new occupant in the Cell.
 * @param newOccupant is a reference to a Piece instance, 
 * and should be set to null if the cell is emptied, or using
 * the method clear().
 */
public void setOccupant(Piece newOccupant){
    this.occupant = newOccupant;
}
/**
 * Used to verify if a Cell is empty of any occupant
 * @return true if cell is empty.
 */
public boolean isEmpty(){
    if(this.occupant == null)
        return true;
    return false;
}
/**
 * Free the cell of any occupant, if any were
 */
public void clear(){
    this.occupant = null;
}

Ответы [ 6 ]

10 голосов
/ 04 июня 2011

Свободное место на доске не является исключением.Это нормально и всегда будет правдой для большинства доски.Вы не должны бросать исключения здесь;исключения должны создаваться только для непредвиденных событий, которые указывают на серьезную проблему с тем, что вы пытаетесь сделать.

Вы, безусловно, можете передать значение null установщику (за исключением примитивного типа, такого как int / long).

Возможно, было бы лучше добавить некоторые удобные методы, метод isEmpty для вашего класса Space:

public boolean isEmpty(){
   if (this.occupant == null) 
      return true;
   return false;
}

, а также, возможно, понятный метод

public void clear() {
    this.occupant = null;
}

, так что вам не нужно проверять нулевое значение результата получения, и вам не нужно передавать нулевое значениеустановить - это дает дополнительные преимущества простоты тестирования и создает API, который имеет значение для вашего класса Space.

6 голосов
/ 04 июня 2011

Если вы хотите запретить нулевые значения, вы должны сделать это с помощью метода установки:

public void setOccupant(Piece occupant) {
  if (occupant == null) throw new NullPointerException("occupant");
  this.occupant = occupant;
}

Обратите внимание, что некоторые люди предпочитают генерировать исключение IllegalArgumentException.В любом случае, смысл в том, чтобы «быстро потерпеть неудачу», как только кто-то установит запрещенное значение.

Сказав все это, шахматная доска, безусловно, может иметь пустые позиции, так что разрешение на ноль, кажется, имеет больше смысла.

Предлагаю вам прочитать "Эффективная Java, 2-е издание" Джоша Блоха.

3 голосов
/ 04 июня 2011

Где вы прочитали эту рекомендацию? На мой взгляд, в возврате null нет ничего плохого, если null передает некоторую полезную информацию и не указывает на серьезную ошибку. В этом случае вполне нормально, чтобы в шахматной ячейке не было фигуры, и я бы определенно ожидал, что getOccupant() в этом случае вернет ноль.

1 голос
/ 04 июня 2011

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

1 голос
/ 04 июня 2011

Если вызывающая сторона знает о возвращаемых значениях NULL, неплохо будет возвращать значения NULL вызываемым пользователем.

0 голосов
/ 06 июня 2011

небольшое предложение нет необходимости в блоке if, вы можете упростить свой код, просто возвращая вывод выражения

public boolean isEmpty(){
    return this.occupant == null
}
...