Вопрос по interface, java, setter, javabeans, getter – Рекомендации по использованию интерфейса Java - Являются ли геттеры и сеттеры в интерфейсе плохими?

35

Что люди думают о лучших рекомендациях для интерфейса? Что должно и не должно входить в интерфейс?

Я слышал, как люди говорят, что, как правило, интерфейс должен определять только поведение, а не состояние. Значит ли это, что интерфейсshouldn't contain getters and setters?

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

Ваш Ответ

11   ответов
24

Я не понимаю, почему интерфейс не может определять геттеры и сеттеры. Например,List.size() эффективно добытчик. Интерфейс должен определять поведение, а неimplementation хотя - он не может сказать, как выhandle государство, но оно может настаивать на том, что вы можете получить его и установить его.

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

РЕДАКТИРОВАТЬ: комментарии предполагают, что геттеры и сеттеры подразумевают простое поле используется для резервного хранения. Я категорически не согласен с этим подтекстом. На мой взгляд, имеется в виду, что он "достаточно дешев". получить / установить значение, но не то, чтобы оно сохранялось как поле с тривиальной реализацией.


РЕДАКТИРОВАТЬ: Как отмечается в комментариях, это четко указано вСпецификация JavaBeans раздел 7.1:

Thus even when a script writer types in something such as b.Label = foo there is still a method call into the target object to set the property, and the target object has full programmatic control.

So properties need not just be simple data fields, they can actually be computed values. Updates may have various programmatic side effects. For example, changing a bean’s background color property might also cause the bean to be repainted with the new color."


Если предполагаемое значениеwere правда, мы можем точно так же выставлять свойства как поля напрямую. К счастью, это подразумеваетdoesn't держись: геттеры и сеттеры совершенно в пределах своих прав для вычисления вещей.

Например, рассмотрим компонент с

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;
}

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

(В противном случае вы могли бы просто выставить поле и покончить с ним ... весь смысл сделать его методом состоит в том, чтобыhide реализация.)
Я не согласен с этим подтекстом. Получатель вполне может рассчитать значение, если он этого хочет.
Если вы предполагаете, что getWhменно () просто возвращает значение поля «что угодно», то когда-нибудь (скоро) что-то докажет, что вы не правы
& quot; Часть постоянного состо ни & quot; ! = & quot; Поле этого типа & quot ;. Постоянное состояние может храниться на карте или как часть более крупного типа (как в примере ширины / высоты / размера, который я показал).
Я бы сказал, что он делает такое предположение, которое играет с огнем, учитывая, что Java API наполнен вещами, и на то есть веская причина. Я бы сказал,implication потому что вы вызываете метод, а не обращаетесь к полю напрямую, выshouldn't предположим, что это ничего не сделает. Если я действительно хочу сообщить, что есть только поле, к которому нужно получить доступ, я выставлю поле.
0

В основном, если ответ на вопрос «Нужно ли мне знать значение [state, property, whatThignAMaGit] для работы с его экземпляром?» & Quot; тогда да ... средства доступа принадлежат интерфейсу.

List.size () от Джона выше - отличный пример геттера, который должен быть определен в интерфейсе

4

Я вообще не думаю, что у боба должен быть интерфейс поверх него. Javabean - это интерфейс в более общем смысле. Интерфейс определяет внешний контракт чего-то более сложного. Внешний контракт Javabean и его внутреннее представление идентичны.

Я бы не сказал, что у вас не должно быть геттеров в интерфейсе. Имеет смысл иметь интерфейс ReadableDataThingie, который реализуется DataThingieBean.

0

Практические API Признания в дизайне Java Framework Architect (Ярослав Тулач, 2008, Apress).

0

Получатели используются для запроса состояния объекта - которого вы действительно можете избежать при разработке вашего интерфейса. Читатьhttp://www.pragprog.com/articles/tell-dont-ask

0

Я использовал такие интерфейсы, например, у нас были классы с полями beginDate, endDate. Эти поля были во многих классах, и у меня был один вариант использования, мне нужно было получить эти даты для разных объектов, поэтому я извлек интерфейс и был очень доволен :)

2

I've heard people say that, as a general rule, an interface must only define behavior and not state. Does this mean that an interface shouldn't contain getters and setters?

Для начала, по крайней мере с Java и исключая объявления исключений, вы не можете определить полное поведение без состояния. В Java интерфейсы не определяют поведение. Они могут "т. Что они определяют, так это типы; обещания реализации набора сигнатур признаков, возможно, с некоторыми постусловиями без исключений. Но это так. Поведение и состояние определяются классами, реализующими эти интерфейсы.

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

With that into consideration, there is nothing wrong - syntactically and semantically - with having setters and getters in interfaces.

Если ваше приложение хорошо смоделировано и проблема требует наличия интерфейса, определяющего сеттеры и геттеры, почему бы и нет. Например, взгляните на интерфейс ServletResponse.

Теперь, если мы рассмотрим методы получения и установки с точки зрения реализации классов, совместимых со спецификациями JavaBeans, вам не нужно определять интерфейсы для них.

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

Надеюсь, поможет.

1

Это касается всей темы «Getter / Setters» - злая тема, которая неоднократно обсуждается на этом сайте и в других местах.

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

12

Я думаю, что есть два типа интерфейсов, заявленных в целом:

  1. a service description. This might be something like CalculationService. I don't think that methods getX should be in this sort of interface, and certainly not setX. They quite clearly imply implementation detail, which is not the job of this type of interface.
  2. a data model - exists solely to abstract out the implementation of data objects in the system. These might be used to aid in testing or just because some people as old as me remember the days when (for example) using a persistence framework tied you down to having a particular superclasss (i.e. you would choose to implement an interface in case you switched your persistence layer). I think that having JavaBean methods in this type of interface is entirely reasonable.

Note: the collections classes probably fit in to type #2

Хаха да Это именно то, что мне было нужно - логика на некоторых центральныхmanagerне данные!
В приведенном выше сценарии вам не нужен библиотекарь?
Предположительно, вы имеете в виду, что я отделяю данные от поведения. Это может быть старомодно, но с тех пор, как я написал «библиотеку» программа в Smalltalk 10 лет назад в этом «живом сообществе объектов» стиль, единственное, что я помню об этом, - это то, что я никогда не мог вспомнить, где находилась моя бизнес-логика. Ссужались ли книги самим клиентам? Или клиенты проверили книги?
Я не могу сказать, шутите ли вы: - / Если нет,what опасно близко к ПП? А что именно было бы не так с PP в любом случае?
Это опасно близко к процедурному программированию.
1

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

Я не думаю, что детали реализации определяют, есть ли что-то в интерфейсе. Скорее, это требуется для клиентских объектов, чтобы сделать свою работу? Если нет, то это, вероятно, не должно быть там
10

Нет ничего плохого в добытчиках / сеттерах. Тем не мение:

  1. I tend to make my objects immutable (in the first instance) with respect to the fields they contain. Why ? I instantiate most things during the construction phase. If I want to change something later then I relax those restrictions. So my interfaces will tend to contain getters, but not setters (there are other benefits - particularly threading).
  2. I want my objects to do things for me, not the other way around. So when one of my objects acquires a number of getters, I start to ask whether that object should have more functionality in it, rather than exposing all its data for something else to work with. See this answer for more detail.

Это все рекомендации, обратите внимание.

Может ли тот, кто отрицал это, указать, почему? Спасибо

Похожие вопросы