Що я повертаю, якщо тип повернення методу недійсний? (Недійсні!)


115

Завдяки використанню Generics у Java мені довелося реалізувати функцію, що має Voidтип повернення:

public Void doSomething() {
    //...
}

і компілятор вимагає повернути щось . Поки що я просто повертаюся null, але мені цікаво, чи це хороша практика кодування ...

Я запитую про V ‌oid, а не v ‌oid. Клас Void, а не зарезервоване ключове слово void.

Я також спробував Void.class, void, Void.TYPE, new Void(), нема вороття на все, але все , що не працює. (З більш-менш очевидних причин) ( Деталі див. У цій відповіді )

  • Отже, що я повинен повернути, якщо тип повернення функції Void?
  • Яке загальне використання Voidкласу?

Відповіді:


104

Отже, що я повинен повернути, якщо тип повернення функції повинен бути Void?

Використовуйте return null. Voidне може бути ініційованим і є лише заповнювачем для Class<T>типу void.

У чому сенс Void?

Як зазначалося вище, це заповнювач. Voidце те, що ви отримаєте назад, якщо, наприклад, використовуєте роздуми для перегляду методу з типом повернення void. (Технічно ви повернетесь Class<Void>.) У цих рядах є інші можливості використання, наприклад, якщо ви хочете параметризувати a Callable<T>.

Завдяки використанню дженериків у Java мені довелося реалізувати цю функцію

Я б сказав, що щось може бути неприємним у вашому API, якщо вам потрібно було реалізувати метод із цим підписом. Ретельно подумайте, чи є кращий спосіб зробити те, що ви хочете (можливо, ви можете надати більше деталей у іншому, наступному питанні?). Я трохи підозрілий, оскільки це з'явилося лише "завдяки використанню дженериків".


13
Зрештою повернути Void не так вже й приємно. Це може бути просто дозволено, наприклад, Callable <T>. Іноді вам просто не потрібно щось повертати, але не можете використовувати, наприклад, Runnable.
Бомбе

Як я вже зазначав, пустота має законне використання. Але він сказав, що "це з'явилося лише завдяки використанню дженериків". Це звучить так, ніби він щось зробив для колекції, яка потребує використання Void, що, я б сказав, є досить винятковим випадком.
Джон Фемінелла

З колекціями це було б дуже дивно.
Бомбе

І Void.class, і void.class - клас <Void>, але вони не рівні. Пустота часто використовується як загальний аргумент у значенні Map (або використовувати Collections.newSetFromMap) та повернення AccessController.doPrivileged.
Том Хотін - тайклін

@Tom: Yeppers. Ось чому я позначив "(Технічно ви повернете Class <Void>.)" Чи варто вносити зміни до цієї частини чи ви вважаєте, що вона є точною?
Джон Фемінелла

26

Немає способу створити порожнечу, тому єдине, до чого можна повернутись, - це null.


13
Точніше, немає способу створити порожнечу, не роблячи злих справ.
Майкл Майерс


20

Щоб зрозуміти, чому інші запропоновані вами пропозиції не працюють:

Void.classі Void.TYPEвказують на один і той же об'єкт і мають тип Class<Void>, а не Void.

Ось чому ви не можете повернути ці значення. new Void()буде типу, Voidале цього конструктора не існує. Насправді, Voidнемає публічних конструкторів, тому їх неможливо уявити: ви ніколи не можете мати жодного об'єкта типу, Voidкрім поліморфного null.

Сподіваюся, це допомагає! :-)


1
Незначна корекція: Void.TYPEне вказує на Void.class. Це вказує на void.class.
шмосель

1

Якщо з незрозумілих причин ОБОВ'ЯЗКОВО використовувати цей тип, то справді повернення нуля здається розумним варіантом, оскільки я припускаю, що повернене значення все одно не буде використовуватися.
Компілятор змусить вас все одно повернути щось.
І цей клас, схоже, не має публічного конструктора, тому новий Void () неможливий.


Я не повинен бути ОБОВ'ЯЗКОВО; це просто умовність.
Том Хотін - тайклін

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