В компании я работаю над документом, описывающим хорошие практики, которые мы должны придерживаться на Java. Один из них - избегать методов, возвращающих this
, например, например:
class Properties {
public Properties add(String k, String v) {
//store (k,v) somewhere
return this;
}
}
У меня был бы такой класс, чтобы я мог писать:
properties.add("name", "john").add("role","swd"). ...
Я видел такую идиому много раз, как в StringBuilder
, и не нашел в ней ничего плохого.
Их аргументация такова:
... может быть источником проблем синхронизации или неудачными ожиданиями относительно состояний целевых объектов.
Я не могу представить себе ситуацию, когда это может быть правдой, может ли кто-нибудь из вас дать мне пример?
РЕДАКТИРОВАТЬ В документе ничего не говорится о изменчивости, поэтому я не вижу разницы между цепочкой вызовов и выполнением:
properties.add("name", "john");
properties.add("role", "swd");
Я попытаюсь связаться с создателями, но я хотел сделать это с загруженным оружием, вот почему я разместил вопрос.
SOLVED. Мне нужно поговорить с одним из авторов, его первоначальное намерение состояло в том, чтобы, по-видимому, не выпускать объекты, которые еще не готовы, как в шаблоне Builder, и объяснили, что если переключатель контекста происходит между вызовами, объект может находиться в недопустимом состоянии. Я утверждал, что это не имеет никакого отношения к возврату this
, поскольку вы могли бы совершить ту же ошибку, купив вызов методов один за другим и больше связавшись с синхронизацией процесса сборки должным образом. Он признал, что документ может быть более явным и вскоре пересмотрит его. Победа моя/наша!