Повернення 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
методу виникає помилка (або будь-яка інша помилка, про яку я зараз не можу подумати), може бути створено виняток, і ви отримаєте оператор повернення.