Best practice: не использовать boolean параметры в методах



На вопрос выше сходу ответят только знатоки многопоточки. Остальные наверняка попытались придумать, что означает cancel(true), и в чём разница с cancel(false).



Метод Future#cancel — наглядная иллюстрация, почему boolean параметры в public методах не ок. Потому что непонятно, что означают true и false.



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



Даже если у параметров хорошие имена, итоговые true и false выглядят несимпатично и неудобно.



С private методами ситуация другая. Внутренняя реализация должна быть читаемой и понятной, но требования всё же менее жёсткие, чем у public методов. В private методах флажки допустимы, но увлекаться не стоит:)



Как исправить метод с boolean параметром?



1️⃣ Сделать два метода



и зашить "особенность" флажка в название. Необязательно дублировать реализацию — public методы могут под капотом вызывать private метод с флажком.



Так сделано, например, в классе HashMap для методов put(k,v) и putIfAbsent(k,v). Оба в итоге вызывают private метод putVal с флажком ifAbsent



2️⃣ Создать enum с двумя значениями и передавать его вместо флажка

enum ReplicateStatus {NO_REPLICATION, REPLICATE};

...

saveRequest(req, ReplicateStatus.REPLICATE);


Такой вариант предлагается в книге Effective Java (Item 51).



Выглядит лучше, чем флажки, но на практике такой способ встречается редко. Если enum нужен только для обозначения true/false, быстрее и проще сделать 2 метода с разными именами.



🔥 Ответ на вопрос перед постом — "невозможно определить".



Мы не знаем точно, начала ли задача выполнение до вызова cancel. Даже если задача стартовала, успех cancel зависит от кода внутри задачи. Поэтому итог непредсказуем🤷‍♀️