Почему метод (не) должен быть одновременно и аксессором, и мутатором?
Многие методы Java в JDK, такие как List.set()
а также Map.put()
оба изменяют объект и возвращают результат, вместо того, чтобы разделять мутатор и метод доступа.
Мне кажется, что для большинства этих методов возвращаемое значение является скорее побочным эффектом, и не имеет смысла иметь отдельный метод для его извлечения.
Но кроме этого, есть ли другие преимущества и недостатки каждого подхода? Как мне решить, какой путь более уместен?
Например, я создаю объект симулятора, вызывая runSimulation()
метод, и мне нужно boolean
результат. Я мог бы сохранить его в объекте имитатора и вернуть его в отдельный метод доступа, вызываемый после, или вернуть его в самом мутаторе, как я делаю сейчас.
1 ответ
Если runSimulation() не является методом блокировки, и вы не хотите запускать его асинхронно, чтобы он не блокировал ваш основной поток, нет никакого вреда в возврате результата тем же методом, с помощью которого вы создали симуляцию, при условии, что его можно выполнить. дешево.
Иногда для удобства: дизайн вашего объекта таков, что пользователи почти всегда будут запрашивать результат после создания / запуска симуляции? Тогда, возможно, будет хорошей идеей вернуть результат в метод мутации (возможно, вы могли бы назвать метод "runSimulationForResult()").
Иногда это вопрос эффективности: для некоторых видов реализаций List (LinkedList и т. Д.) Вызов get(), за которым следует set(), означает, что список просматривается дважды, а не один раз, и хотя это может быть не очень распространенный шаблон дизайнеры решили, что при возврате предыдущего значения не было никакого вреда, так как оно может быть достигнуто практически бесплатно и позволит сделать некоторые идиомы в два раза быстрее.