Использование геттеров в методах класса

StackOverflow https://stackoverflow.com/questions/629029

  •  07-07-2019
  •  | 
  •  

Вопрос

Если у вас есть класс с некоторыми простыми свойствами get/set, есть ли смысл использовать геттеры внутри методов класса, или вам следует просто использовать частные переменные-члены?Я думаю, что может быть больше споров по поводу сеттеров (логика проверки?), но меня интересуют только геттеры.

Например (в Java) – есть ли смысл использовать вариант 2?:

public class Something
{
    private int messageId;
    public int getMessageId() { return this.messageId; }
    public void setMessage(int messageId) { this.messageId = messageId; }

    public void doSomething()
    {
        // Option 1:
        doSomethingWithMessageId(messageId);

        // Option 2:
        doSomethingWithMessageId(getMessageId());
    }
}
Это было полезно?

Решение

Java-программисты, как правило, очень последовательны в использовании методов получения. Я программирую на нескольких языках, и я не настолько последовательна в этом;)

Я бы сказал, если вы не создаете геттер, то можно использовать переменную raw - для переменных private . Когда вы делаете геттер, вы должны использовать только это. Когда я делаю геттер для приватного поля, моя среда IDE предлагает автоматически заменить необработанные обращения к полям, когда я представляю геттер. Переключение на использование геттера происходит всего в нескольких нажатиях клавиш (и без каких-либо шансов на появление ошибок), поэтому я склонен откладывать его до тех пор, пока он мне не понадобится.

Конечно, если вы хотите использовать такие вещи, как getter-инъекция, некоторые типы фреймворков для проксирования и создания подклассов, такие как hibernate, вы должны использовать getter!

Другие советы

С геттерами вы случайно не измените переменные :) Кроме того, если вы используете и геттеры, и " raw " переменная, ваш код может запутаться.

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

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

Кроме того, если в методе установки когда-либо будет введена логика, вам не придется беспокоиться об изменении более чем одного местоположения для нее.

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

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

Вот пример (на C #):

public class Something {

   private string _value;

   public string Value {
      get {
         return _value;
      }
      set {
         if (value == null) throw new ArgumentNullException();
         _value = value;
      }
   }

   public Something() {
      // using a known value
      _value = "undefined";
   }

   public Something(string initValue) {
      // using an unknown value
      Value = initValue;
   }

}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top