JavaRush /Java блог /Random UA /Повертайте масив нульової довжини, а не null
alexnjc
31 рівень

Повертайте масив нульової довжини, а не null

Стаття з групи Random UA
Нерідко зустрічаються методи, що мають такий вигляд:
private List cheesesInStock =;
/**
* @return массив, содержащий все сыры, имеющиеся в магазине,
* або null, если сыров для продажи нет.
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0)
return null;
}
Немає причин розглядати як особливий випадок ситуацію, коли у продажу немає сиру. Це вимагає від клієнта написання додаткового коду для обробки значення, що повертається методом пull, наприклад:
Cheese[] cheeses = shop.getCheeses();
if (cheeses ! = пull &&
Аrrауs.аsList(shор.gеtСhееsеs()).соntаins(Сhееsе.SТILТON))
Sуstеm.оut.рrintln("Jоllу good, just the thing.");
замість простого:
if  (Аrrаys.аsList(shор.gеtСhееsеs()).соntаins(Сhееsе.SТILTON)) Sуstеm.оut.рrintln("Jоllу good, just the thing.");
Така багатомовність необхідна майже при кожному виклику методу, який замість масиву нульової довжини повертає null. Це може призвести до помилок, оскільки розробник клієнта міг і не написати спеціальний код для обробки результату null. Помилка може залишатися непоміченою роками, оскільки подібні методи зазвичай повертають один або кілька об'єктів. Слід ще згадати, що поверненняnullзамість масиву призводить до ускладнення самого методу, що повертає масив. Іноді можна почути заперечення, що повернення значення null краще, ніж повернення масиву нульової довжини тому, що це дозволяє уникнути витрат на розміщення масиву в пам'яті. Цей аргумент неспроможний із двох причин. По-перше, на цьому рівні немає сенсу турбуватися про продуктивність, якщо тільки профіль програми не покаже, що саме цей метод є основною причиною падіння продуктивності. По-друге, при кожному виклику методу, який не повертає записів, клієнту можна передавати той самий масив нульової довжини, оскільки будь-який масив нульової довжини незмінний, а незмінні об'єкти доступні для спільного використання. Насправді, саме це і відбувається,
private List сhееsеsInStосk =,
private fiпаl static Cheese[] NULL_CHEESE_ARRAY = nеw Cheese[0];
 /**
* @геtuгп массие, содержащий все сыры, имеющиеся в магазине
*/
public Cheese[] getCheeses() {
геtuгп (Cheese[] сhееsеsInStосk.tоАггау(NULL_СНЕЕSЕ_АRRАУ);
}
У цій ідіомі константа у вигляді масиву нульової довжини передається методу toArrayдля того, щоб показати який тип він повинен повернути. Зазвичай метод toArrayвиділяє місце в пам'яті для масива, що повертається, проте якщо колекція порожня, вона розміщується у вхідному масиві, а специфікаціяСollесtion,tоАггау(Оbjесt[])дає гарантію, що якщо вхідний масив буде достатньо місткий, щоб містити колекцію, буде повернено саме він. Тому представлена ​​ідіома ніколи не сама розміщувати в пам'яті масив нульової довжини, а в якості такого використовує "константу із зазначенням типу". Підведемо підсумки. Немає жодних причин для того, щоб метод, що працює з масивами, повертав значення null, а не масив нульової довжини. Така ідіома, мабуть, походить з мови програмування, де довжина масиву повертається окремо від самого масиву. У мові С марно виділяти пам'ять під масив нульової довжини. Джерело: Джошуа Блох, Java TM Ефективне програмування, Видавництво «Лорі»
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ