Чи є якась причина, щоб не використовувати Необов’язковий як аргумент методу у тому випадку, коли вам відомо, що аргумент є чимось, що може бути або не потрібно?


11

З Java 8 я переглядаю все нові й нові статті про використання опції / необов’язково. Я розумію, що вони намагаються представляти, і бачу багато прикладів їх використання як повернення. Однак те, що я не бачу, - це те, що вони використовуються як аргументи методу / функції на мовах, у яких немає синтаксису параметрів за замовчуванням / за бажанням.

Чи є якась причина не використовувати Optionalяк аргумент методу у тому випадку, коли вам відомо, що аргумент є чимось, що може бути, а може і не потрібно? Ось приклад, про який я міг би придумати:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

Це загальне використання для них у Haskell, який також не має аргументів за замовчуванням (currying біль).
Даніель Гратцер

Дивіться мою відповідь на відповідне запитання щодо переповнення стека. Коротко кажучи, Optionalпризначений насамперед для повернених значень, які можуть бути відсутніми. Звичайно, можливі й інші способи використання, але вони громіздкі та, ймовірно, поганий.
Стюарт Маркс

Відповіді:


6

Однією з причин є те , що концептуально firstName, middleNameі lastNameлогічно один аргумент, а не три. Вони всі частини більшого цілого, і можна уявити, що вони майже завжди передаються разом. У функціональних мовах вони, швидше за все, передаються у вигляді кортежу або запису; У Java не вистачає таких, тому вони, ймовірно, будуть об'єднані в клас Name. Зауважте, що якщо вам потрібно було скласти функції, які приймають та повертають повні імена, ви не зможете без їх агрегування - ви можете повернути лише одне значення.

Можливо, просто не виникає дуже часто, що значення є необов’язковим, а також не є частиною більшого цілого. Якщо функція вимагає певного значення, щоб виконати свою роботу, то ця функція не повинна сприймати an Optional. Якщо вам потрібно ланцюжок операцій, які можуть не повернути значення, припиняючи, Nothingякщо якась функція по дорозі не спрацьовує, ви можете ланцюжок викликів flatMap, а якщо ви хочете вийти з ладу за винятком, ви можете використовувати get()на будь-якому кроці шляху або на кінець ланцюга.

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

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


5

Не дуже багато мов, які не підтримують аргументи за замовчуванням, тому це не є звичайним використанням. Я особисто думаю, що ваше використання не є страшним, але це не буде ідіоматичною Java. У Java дуже навмисно немає аргументів за замовчуванням, щоб змусити використовувати замість цього перевантаження, що має перевагу компілятора перевіряти ваші аргументи замість того, щоб вимагати ifоператорів всередині функції.

Іншими словами, ви збираєтеся робити дві різні версії запиту: одну із прізвищем та одну без. Якщо ви можете це зробити лаконічно, корисно використовувати варіант. Якщо це досить багатослівний, що ви хочете його хотіти в двох окремих функціях, ви можете також використовувати перевантаження і зробити це ідіоматичним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.