Сеттеры возвращают ссылку на экземпляр.Шаблон или анти-шаблон? - PullRequest
6 голосов
/ 06 октября 2011

Я думал о структуре кода и думал о сеттерах. Раньше это были пустые методы, так почему бы не использовать какое-нибудь возможное возвращаемое значение, чтобы включить новую структуру кода?

Моя идея состояла в том, чтобы изменить все установщики свойств с void на ссылку на экземпляр, чтобы мы могли делать установщики последовательно или что-то еще. Вот пример:

public class MyClass {
    private int foo;
    private String bar;

    public MyClass setFoo(int foo) {
        this.foo = foo;
        return this;
    }

    public MyClass setBar(String bar) {
        this.bar = bar;
        return this;
    }

}

Тогда в другом месте кода мы могли бы сделать:

...
MyClass myInstance = new MyClass();
myInstance.setFoo(auxFoo).setBar(auxBar);
...

Это позволяет установить все свойства класса в одной строке, что полезно в методах преобразования.

Или даже:

...
return myInstance.setFoo(auxFoo);

Это было моей целью, например, иметь возможность установить свойство ошибки при его возврате Это может упростить блок catch, например.

EDIT: После некоторых ответов мне нужно добавить:

  • Вопрос касается только сеттеров (не о том, чтобы делать это во всех методах), и не ограничивается цепочкой, а другими способами, такими как пример return.
  • Может ли переход от пустоты к чему-то другому создать какие-либо проблемы? Самоанализ JavaBeans, например.
  • Можете ли вы увидеть больше преимуществ или недостатков этого?

Я надеялся увидеть обсуждение.

Ответы [ 5 ]

12 голосов
/ 06 октября 2011

Это распространенная техника, известная как Метод цепочки .Hibernate использует его в своих классах Criteria и присутствует в других популярных инфраструктурах, таких как Wicket.

Как правило, вы должны быть осторожны и применять его в тех void методах, в которых вы уверены, чтоникогда не нужно будет ничего возвращать.И вы не должны использовать его в своих Java Beans , как это уже обсуждалось в этом вопросе: Разрешает ли установщик Java-компонента возвращать это? .

См. этот связанный вопрос SO , где приведены некоторые советы и недостатки, которые могут быть полезны при использовании этого шаблона.

6 голосов
/ 06 октября 2011

Это довольно распространенная практика и определенно шаблон, а не анти-шаблон. Это чаще упоминается как:

http://en.wikipedia.org/wiki/Fluent_interface

и

http://en.wikipedia.org/wiki/Method_chaining

Некоторые превосходные библиотеки используют его: jQuery и joda-time.

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

За то, что это стоит, мне действительно нравится.

3 голосов
/ 06 октября 2011

Я думаю, что этот шаблон имеет свои применения, и в этом нет ничего плохого по своей сути.

Я лично время от времени использую его.Есть хорошо зарекомендовавшие себя библиотеки, например, Gson .Хотя Java StringBuilder.append() не является строго сеттером, он не отличается по духу.

2 голосов
/ 06 октября 2011

Это относится к ряду хорошо известных и признанных шаблонов.

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

Более конкретный пример этого типа цепочки методов - это когда методы используются для установки свойств экземпляра, используемого в качестве входных данных для функции.Это популярно в C ++ и называется Имена именованных параметров .

2 голосов
/ 06 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...