2010-06-14 5 views
1

Возможные Дубликаты:
Public Data members vs Getters, Setters
Purpose of private members in a classЦель геттеров и сеттеров?

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

+0

Возможный дубликат: http://stackoverflow.com/questions/2903385/property-and-encapsulation – Paolo

+0

Просто, чтобы вы знали, я реализовал геттеры и сеттеры в своей программе сначала так же просто (и imo в то время, бесполезно), чтобы изменять или извлекать переменные, но они оказались спасателями во время отладки в метании исключений. Я не вижу, как отладка была бы настолько легкой, если бы они были публичными :) – wrongusername

ответ

11

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

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

0

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

3

Getters and setters могут делать валидацию и ленивую инстанцирование, тогда как публичные члены не могут.

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

+0

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

3

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

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

if(value >= 0) 
{ 
    _age = value; 
} 
else 
{ 
    throw new InvalidAgeException("Age may not be less than 0"); 
} 
2

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

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

Смежные вопросы