Повернення null; необхідний, оскільки може бути вилучено виняток, однак у такому випадку, оскільки ми вже перевірили, чи є воно нульовим (і припустимо, що ми знаємо клас, який ми викликаємо, підтримує клонування), тому ми знаємо, що оператор try ніколи не провалиться.
Якщо ви знаєте подробиці про введені дані таким чином, що ви знаєте, що tryтвердження ніколи не може провалитися, який сенс його мати? Уникайте, tryякщо ви точно знаєте, що речі завжди будуть успішними (хоча рідко ви можете бути абсолютно впевненими протягом усього життя своєї кодової бази).
У будь-якому випадку, компілятор, на жаль, не є читачем думок. Він бачить функцію та її вхідні дані, і з огляду на інформацію, якою вона володіє, йому потрібна ця returnзаява внизу, як у вас є.
Чи погана практика вкладати додатковий оператор return в кінці лише для задоволення синтаксису та уникнення помилок компіляції (з коментарем, який пояснює, що це не буде досягнуто), чи є кращий спосіб кодувати щось подібне, щоб додаткові оператор повернення непотрібний?
Навпаки, я б порадив, що вдалою практикою є уникати будь-яких попереджень компілятора, наприклад, навіть якщо це коштує іншого рядка коду. Не переживайте занадто багато про кількість ліній тут. Встановіть надійність функції шляхом тестування, а потім рухайтесь далі. Просто роблячи вигляд, що ви можете пропустити returnтвердження, уявіть, що через рік повернетесь до цього коду, а потім спробуйте вирішити, чи returnне призведе це твердження внизу більше плутанини, ніж якийсь коментар із деталізацією деталей, чому його було опущено через припущення, що ви можете зробити про вхідні параметри. Швидше за все, із returnзаявою буде легше впоратися.
Сказано, особливо про цю частину:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
Думаю, тут є щось дивне із мисленням щодо обробки винятків. Зазвичай ви хочете проковтнути винятки на сайті, де у вас є щось значуще, що ви можете зробити у відповідь.
Ви можете сприймати try/catchмеханізм транзакцій. tryроблячи ці зміни, якщо вони не вдаються, і ми переходимо до catchблоку, робимо це (все, що є в catchблоці) у відповідь як частину процесу відкоту та відновлення.
У цьому випадку просто надрукувати стек-трас, а потім змусити його повернути null - це не зовсім спосіб мислення транзакції / відновлення. Код передає відповідальність за обробку помилок усьому коду, що викликає, getCloneщоб вручну перевірити наявність помилок. Можливо, ви віддаєте перевагу зловити CloneNotSupportedExceptionта перекласти його в іншу, більш значущу форму винятку і кинути це, але ви не хочете просто проковтнути виняток і повернути нуль у цьому випадку, оскільки це не схоже на сайт для відновлення транзакцій.
У кінцевому підсумку ви випустите обов'язки перед абонентами, щоб перевірити вручну та впоратися з несправністю таким чином, коли створення виключення дозволить уникнути цього.
Це як якщо ви завантажуєте файл, це транзакція високого рівня. Можливо, у вас try/catchтам є. Під час tryingзавантаження файлу ви можете клонувати об'єкти. Якщо в цій операції високого рівня (завантаження файлу) де-небудь є збій, зазвичай потрібно повернути винятки до цього try/catchблоку транзакцій найвищого рівня, щоб ви могли елегантно відновитись після помилки під час завантаження файлу (чи це через помилку в клонуванні або щось інше). Тому ми, як правило, не хочемо просто проковтнути виняток у такому деталізованому місці, як це, а потім повернути нуль, наприклад, оскільки це переможе велику частину значення та мети винятків. Натомість ми хочемо поширювати винятки аж до веб-сайту, де ми можемо суттєво з цим боротися.
Objectпараметр. Якщоaклас не підтримуєcloneметод (або це визначено вObject?) Або якщо під часcloneметоду виникає помилка (або будь-яка інша помилка, про яку я зараз не можу подумати), може бути створено виняток, і ви отримаєте оператор повернення.