Какая разница, когда я называю переменной без получения и если я буду называть его получить ...
Вообще, если речь идет о доступе к атрибуту в классе, есть почти нет разницы, потому что вы по-прежнему получаете доступ к одному и тому же атрибуту.
Однако все еще есть тонкая разница, которую я верну в этот момент позже.
Теперь, если вы получаете доступ к атрибуту извне класса. Вы не сможете получить доступ к атрибуту, если он отмечен с помощью модификатора доступа private
.
Пример:
class Hero{
private int health; //inaccessible from anywhere outside the class
public int getHealth(){
return health; //allows access of health outside the class
}
}
Теперь представьте себе, если health
был объявлен общественности и просто получить доступ к нему напрямую, используя myHero.health
и в один прекрасный день вы понимаете, что вам нужно изменить тип данных health
к чему-то еще, например как класс для представления здоровье:
class Health{
private int minHealth;
private int maxHealth;
private int healthValue;
}
Но вы уже кодирования с myHero.health
так часто, что вы ар у меня возникли проблемы с изменением кода.
Теперь, представьте, если вы кодировали myHero.getHealth()
. Теперь это изменится, потому что весь код может продолжать использовать геттер, который равен getHealth()
, чтобы получить значение здоровья. Все, что вам нужно сделать, это изменить реализацию getHealth()
вернуть значение здоровья:
class Hero{
private Health health; //Data type changed, no worries..
public int getHealth(){
return health.getHealthValue(); //Implementation can be changed here..
}
}
Тип данных health
может быть изменена без особых забот (с точки зрения других модулей, которые зависят от него непосредственно). Так как это private
, нет никакой зависимости от него, и мы можем изменить его, не имея слишком много побочных эффектов.
Теперь возвращаясь к разговору о доступе к атрибуту внутри самого класса. Лично я считаю, что по-прежнему будет безопасно звонить получателю, а не напрямую обращаться к атрибуту.
Используя следующий пример:
class Circle{
private double radius;
private double area;
public double getArea(){
return Math.PI * radius * radius;
}
}
Это не хороший дизайн, но ради объяснения, я написал это так.
Так что в классе Circle
, может показаться, что this.area
и this.getArea()
делает то же самое. Но в некоторых случаях сам геттер может выполнять работу больше, чем просто передавать вам голую переменную. Написание this.area
может иметь тенденцию давать вам 0.0 вместо области, основанной на радиусе.
Еще раз, не лучший пример, но вы поняли мою точку зрения.
'this.variable' относится к полю текущего объекта. 'this.getVariable()' - вызов функции. – mallaudin
@bradimus Я не думаю, что это дубликат. В упомянутом вопросе спрашивается о геттерах и сеттерах для мира _outer_. Этот вопрос вместо этого просит об использовании геттера (или нет) _inside_ того же класса. – Seelenvirtuose
Вопрос - это дубликат. В упомянутом вопросе нет упоминания о том, что его следует применять только к «внешнему миру». Те же правила применяются для обеих ситуаций. –