Вы должны использовать геттер / сеттер.
Вам следует использовать геттер / сеттер.
Вам следует использовать геттер / сеттер.
Если вы этого не сделаете, вы не хороший программист. Действительно?

Но создание геттеров и сеттеров - отличный способ загрязнить ваш код. В большинстве случаев вы ничего не делаете с переменной в методах получения и установки. Зачем вообще их иметь? Если ваша компания платит вам строками кода, держу пари, вы никогда не будете жаловаться на их наличие. (Вместо этого вы лучше уйдете из этой компании. Я имею в виду, что после того, как вы сгенерируете миллион строк бесполезного кода; P)

На самом деле, методы получения и установки совершенно бесполезны, если вы действительно уверены, что не будете использовать свой класс иначе, чем изначально планировали. Я выделил слово «действительно», потому что код почти всегда развивается за пределами нашего первоначального намерения. Вот почему стало хорошей практикой иметь методы получения и установки для переменной и никогда не разрешать прямой доступ к переменной! Посмотрите на следующий код:

class YourClass {
    public int myVar;
}
class SomeoneElseClass {
    public void doSomethingWithYourClass(YourClass yc){
        yc.myVar = getValueFromBlackhole();
        transmitToWhitehole(yc);
    }
}

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

Эта передовая практика может стать неуместной, если вы используете язык, который может подключать методы получения и установки к существующему интерфейсу. Таким образом, вам не нужно загрязнять свой код явным написанием методов получения и установки с самого начала.

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

Python
В Python вы можете объявить общедоступную переменную, которая позволяет другим классам обращаться к ней напрямую. Это звучит очень плохо, если вы программист на Java, но для людей Python это нормально, потому что они могут изменить свое мнение позже, добавив свойство function (метод), не затрагивая интерфейс.

//Your class
class YourClass(object):
    my_var = 0
class SomeoneElseClass(object):
    def do_something(self, yc):
        yc.my_var = get_value_from_blackhole()
        transmit_to_whitehole(yc)

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

class YourClass(object):
    my_var = 0
    @property
    def my_var(self):
        return self._my_var
 
    @my_var.setter
    def my_var(self, value):
        print(“Easy peasy”)
        self._my_var = value

Альтернативный подход - использовать функцию property вместо аннотаций.

class YourClass(object):
    def get_my_var(self):
        return self._my_var
    def set_my_var(self, value):
        print(“Easy peasy”)
        self._my_var = value
    my_var = property(get_my_var, set_my_var)

C # .NET

В C # есть специальный синтаксис для функции свойств, в отличие от Python, в котором используются либо аннотации, либо функции. Вы можете ошибиться, что следующий код - это Java-код. Да, он компилируется на Java. Итак, я немного скорректировал формат кода, чтобы он больше походил на .NET :).

class YourClass
{
    public int MyVar;
}
class SomeoneElseClass 
{
    public void DoSomethingWithYourClass(YourClass yc)
    {
        yc.MyVar = GetValueFromBlackhole();
        TransmitToWhitehole(yc);
    }
}

Однажды вы захотите добавить метод установки, вы можете сделать это, объявив свойство с тем же именем, что и общедоступная переменная, и измените имя поддерживающей переменной на другое. Обратите внимание: если вы хотите добавить к свойству мутатор (сеттер), вам также необходимо добавить метод доступа (геттер). В противном случае он не скомпилируется. Напротив, вы можете добавить только аксессуар без мутатора.

class YourClass
{
    //rename MyVar to myVar and use it as backing variable
    private int myVar;
    //add property MyVar to replace MyVar variable
    public int MyVar 
    {
        get { return myVar; }
        set 
        {
            System.Console.WriteLine(“Easy peasy”);
            myVar = value;
        }
    }
}

Scala

В Scala нет специальных ключевых слов, аннотаций или функций для реализации функции свойств, как в Python, .NET и некоторых других языках. Scala использует для этого соглашение об именах, и компилятор знает, как с этим обращаться.

class YourClass() {  
    var myVar = ""
}
class SomeoneElseClass() {
    def doSomething(yc: YourClass) = {
        yc.myVar = getValueFromBlackhole()
        transmitToWhitehole(yc)
    }
}

Если вы хотите добавить метод установки для переменной myVar, вам необходимо переименовать переменную myVar в _myVar (может быть любое имя, которое будет не сталкиваться с myVar) и измените его видимость на private. Вы также должны объявить функцию с именем myVar для средства доступа и myVar_ = для мутатора. Обратите внимание, что вы должны объявить методы доступа и мутатора, чтобы мутатор работал. (то же правило, что и Python и C # .NET)

class YourClass() { 
    //rename myVar variable to _myVar 
    private var _myVar = 0
    //getter
    def myVar = _myVar
    //setter 
    def myVar_= (value: Int): Unit = _myVar = value 
}

Но действительно? Кто вообще использует эту функцию в Scala: P. Некоторые разработчики Scala даже не подозревают о существовании этой функции. Вы можете программировать Scala так же, как и Java, но это обескураживает. Людям, работающим с Scala, нравится, что в их программе нет изменяемого состояния, и они делают свой код максимально функциональным. Изменяемые состояния используются только в исключительных случаях, таких как ввод-вывод низкого уровня.

А как насчет Java?
К сожалению, в Java нет стандартной функции свойств, и похоже, что они не планируют добавлять ее в ближайшем будущем. По крайней мере, не в Java 9 или 10. Тем не менее, вы можете использовать фреймворк, который может генерировать для вас методы получения и установки. Если интересно, загляните в проект ломбок. По сути, это фреймворк генерации кода, который за кулисами генерирует для вас методы получения и установки. Он также может генерировать другие методы, такие как toString (), equals () и hashCode (). Этот инструмент очень удобно использовать, когда у вас много классов данных (нет бизнес-логики, только простые атрибуты POJO).

Если в вашем проекте работает ломбок, вам просто нужно аннотировать свой класс данных с помощью аннотации @Data, как показано ниже.

public class @Data YourClass {
    private int myVar;
}

Lombok сгенерирует код и скомпилирует. Вы не увидите генерируемый им код, но он будет похож на следующий.

public class YourClass {
    private int myVar;
    
    public int getMyVar(){ 
        return myVar;
    }
    
    public void setMyVar(String myVar){
        this.myVar = myVar;
    }
    @Override public String toString(){
        return "YourClass(" + this.getMyVar() + ")";
    }
    protected boolean canEqual(Object other) {
        return other instanceof YourClass;
    }
    @Override public boolean equals(Object o) {
        if (o == this) return true;
        if(! (o instanceof YourClass)) return false;
        YourClass other = (YourClass)o;
        if(!other.canEquals((Object)this)) return false;
        if(this.getMyVar() != other.getMyVar()) return false;
        return true;
    }
    @Override public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        result = (result * PRIME) + this.geMyVar();
        return result;
    }
}

Приятно, правда? Я знаю, что другие языки предоставляют эту функцию из коробки. Но если вам нужно использовать Java, ломбок - это то, что вам нужно.