Я не понимаю, почему интерфейс не может определять геттеры и сеттеры. Например, List.size()
фактически является геттером. Интерфейс должен определять поведение, а не реализацию , хотя он не может сказать, как вы будете обрабатывать состояние, но он может настаивать на том, чтобы вы могли получить и установить его.
Например, все интерфейсы коллекций связаны с состоянием, но разные коллекции могут хранить это состояние радикально по-разному.
РЕДАКТИРОВАТЬ: комментарии предполагают, что геттеры и сеттеры подразумевают, что простое поле используется для резервного хранения. Я категорически не согласен с этим подтекстом. На мой взгляд, подразумевается, что получить / установить значение «достаточно дешево», но не то, что оно хранится как поле с тривиальной реализацией.
РЕДАКТИРОВАТЬ: Как отмечено в комментариях, это явным образом указано в спецификации JavaBeans раздел 7.1:
Таким образом, даже когда автор сценария печатает
в чем-то вроде b.Label = foo
есть еще вызов метода в
целевой объект для установки свойства, и
целевой объект имеет полный
программное управление.
Так что свойства не должны быть простыми
поля данных, они могут быть
вычисленные значения. Обновления могут иметь
различные программные побочные эффекты. За
Например, изменение фона бина
свойство цвета может также вызвать
боб будет перекрашен с новым
цвет. "
Если бы предполагаемое значение было true, мы могли бы точно так же выставить свойства как поля напрямую. К счастью, это значение не справедливо: геттеры и сеттеры имеют полное право на вычисления.
Например, рассмотрим компонент с
getWidth()
getHeight()
getSize()
Верите ли вы, что существует три переменных? Разве не разумно иметь:
private int width;
private int height;
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public Size getSize() {
return new Size(width, height); // Assuming an immutable Size type
}
или (предпочтительно ИМО):
private Size size;
public int getWidth() {
return size.getWidth();
}
public int getHeight() {
return size.getHeight();
}
public Size getSize() {
return size;
}
Здесь либо свойство размера, либо свойства высоты / ширины предназначены только для удобства, но я не вижу, чтобы это каким-либо образом делало их недействительными.