хорошая практика программирования - получить и установить методы - PullRequest
2 голосов
/ 28 марта 2012

Как видно из приведенного ниже класса, объявляются 2 приватные переменные экземпляра и 2 метода get & 2 set, связанные с каждым приватным членом, что позволяет манипулировать ими и проверять их.

Мой вопрос: что лучшеиспользовать в замедлении конструктора переменные экземпляра непосредственно, как показано в фрагменте ниже, или использовать методы набора, связанные с ними, а также способствующие хорошим программным практикам для использования в методе toString, переменных экземпляра или методах их получения?

спасибо за ваше время.

public Class Employee {

  private String firstName;
  private String lastName;

  public Employee (String first, String last)
  {
    firstName = first;
    lastName = last;
  }//end of constructor

  public void setFirstName(String first)
  {
    firstName = first;
  }//end of method setFirstName

  public String getFirstName()
  {
    return firstName;
  }

  public void setLastName(String last)
  {
    lastName = last;
  }//end of method setLastName

  public String getLastName()
  {
    return lastName;
  }//end of method getLastName

  public String toString()
  {
    return String.format ("%s: %s %s\n", "Employee Name: ", firstName, lastName);
  }//end of method toString

}//end of class Employee

Ответы [ 5 ]

5 голосов
/ 28 марта 2012

Я склоняюсь к инициализации через конструкцию. Используя этот метод и предоставляя соответствующие проверки (время компиляции через final и время выполнения через нулевые проверки или аналогичные), вы можете убедиться, что ваш объект правильно и полностью создан.

Использование ключевого слова final в ваших полях заставит компилятор проверить, что вы присвоили значение этому полю при создании. Это означает, что поле является неизменным, но удивительно, как часто это требуется.

Я бы с осторожностью предоставил добытчики для всего. Если вы постоянно предоставляете и используете геттеры, это говорит о том, что вы извлекаете данные из своего объекта и манипулируете ими вне этого объекта. Помните - ключевой принцип ОО - заставлять объекты делать что-то для вас , а не запрашивать у них данные и делать это самостоятельно.

2 голосов
/ 28 марта 2012

Правило # 1, всегда ограничивайте доступ к наименее необходимому, то есть, если вам явно не нужно изменять значения имени / фамилии, сделайте объект неизменным (конструктор с параметрами, нет только установщиков с геттерами)

1 голос
/ 28 марта 2012

В целом, я стараюсь не вызывать нестатические методы из конструктора (так как объект не полностью инициализирован на этом этапе). Если методы setter только устанавливают поле в значение параметра, как описано выше, я бы просто установил его в конструкторе (т.е. не вызывал setter). Если сеттер более сложен, я бы попытался выделить логику для статического вспомогательного метода и использовать ее как из конструктора, так и из метода сеттера. Что-то вроде:

 int field_;     

 Constructor(int initialValue) {
     field_ = helper(initialValue);
 }

 public void setField(int value) {
     field_ = helper(value);
 }

 // not really complex, but avoid duplication of logic
 private static int helper(int value) {
     return 2*value;
 }
1 голос
/ 28 марта 2012

Если вы ожидаете, что ваш класс будет расширен (и переопределен метод получения / установки), лучше использовать методы вместо переменных.

ПРИМЕЧАНИЕ. Я не уверен, что именно происходит вконструктор, вам, вероятно, лучше установить переменную напрямую.

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

0 голосов
/ 28 марта 2012

Я бы использовал сеттер. Иногда у вас есть дополнительный код в установщиках. Например, установщик для списка может также перехватывать событие Changed списка, и, не используя установщик, вы не будете захватывать событие Changed.

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