Назначение геттеров и сеттеров?

Возможные дубликаты:
члены общедоступных данных против геттеров, сеттеров
Назначение закрытых членов в классе

Какая польза от геттеров и сеттеров, если вы можете просто сделать свои переменные общедоступными и избежать хлопот с такими строками, как A.setVariableX(A.getVariableY())?


person wrongusername    schedule 14.06.2010    source источник
comment
Возможный дубликат: stackoverflow.com/questions/2903385/property-and-encapsulation   -  person Paolo    schedule 14.06.2010
comment
Просто чтобы вы знали, сначала я реализовал в своей программе геттеры и сеттеры, такие же простые (и в то время бесполезные) функции для изменения или извлечения переменных, но они оказались спасателями во время отладки при выдаче исключений. Я не понимаю, как отладка была бы такой простой, если бы они были общедоступными :)   -  person wrongusername    schedule 16.06.2010


Ответы (5)


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

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

person AllenJB    schedule 14.06.2010

Геттеры и сеттеры могут выполнять проверку и ленивое создание экземпляров, тогда как открытые члены - нет.

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

person Rowland Shaw    schedule 14.06.2010
comment
Странно то, что 99% сеттеров / получателей не предназначены для проверки или ленивой инициализации ... Несмотря на это, Java - это все о них ... посмотрите на компоненты Pojo ... Это правда, что с помощью IDE они этого не делают вообще беспокоит разработчика, но все же ... Это не имеет отношения к Reflection ... Единственное, что имеет отношение к этому, - это проксирование, для которого требуются сеттеры / геттеры - person lisak; 18.06.2011

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

например, если вашему возрасту не разрешено быть -1, вы должны проверить это в своем сеттере.

if(value >= 0)
{
   _age = value;
}
else
{
  throw new InvalidAgeException("Age may not be less than 0");
}
person Pieter Germishuys    schedule 14.06.2010

Сеттеры и геттеры применяются к свойствам, какие бы «свойства» ни были в вашем коде.

Например, у вас может быть переменная angle, в которой хранится значение угла, выраженное в радианах. затем вы можете определить сеттеры и геттеры для этой переменной с любыми угловыми единицами, которые вы считаете подходящими.

person mouviciel    schedule 14.06.2010

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

person Matteo Riva    schedule 14.06.2010