В Java, где может появиться оператор return? - PullRequest
3 голосов
/ 31 января 2011

Кроме того, внутри тела метода / конструктора?

Кроме того, есть ли что-то, что может быть возвращено конструктором? Или я могу использовать только "return;" без каких-либо выражений после него?

Ответы [ 6 ]

7 голосов
/ 31 января 2011

В Java, где может появиться оператор возврата?Кроме того, внутри тела метода / конструктора?

Только в конструкторе или методе:

JLS - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767

Оператор возврата возвращает управлениевызывающий метод (§8.4, §15.12) или конструктор (§8.8, §15.9) .


Также, есть что-то, что может быть возвращено конструктором?

Нет

JLS - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767

Возвратоператор с выражением должен содержаться в методе декларации о том, что объявлен как возвращающий значение (§8.4) или происходит ошибка времени компиляции.


Или я могу использовать только «return»;без какого-либо выражения после него?

Да

JLS - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767

Оператор возврата без выражения должен бытьсодержится в теле метода, который объявлен с использованием ключевого слова void, чтобы не возвращать никакого значения (§8.4), или в теле конструктора (§8.8)

5 голосов
/ 31 января 2011

Источником правды для этого и многих других вопросов юриста по языку является Спецификация языка Java , в данном случае раздел 14.17 :

Aоператор return возвращает управление вызывающему методу (§8.4, §15.12) или конструктору (§8.8, §15.9).

ReturnStatement:
return Выражение opt;

Оператор возврата без выражения должен содержаться в теле объявленного метода с использованием ключевого слова void, чтобы не возвращать никакого значения (§8.4), или в телеконструктор (§8.8).Ошибка времени компиляции происходит, если оператор возврата появляется в инициализаторе экземпляра или статическом инициализаторе (§8.7).Оператор возврата без выражения пытается передать управление вызывающему методу или конструктору, который его содержит.

Если быть точным, оператор возврата без выражения всегда завершается преждевременно, причиной является возврат без значения.

Обратите внимание, что это явно указывает на то, что вы можете использовать оператор возврата в конструкторе - но он действительно ограничивает его конструкторами и методами.

4 голосов
/ 31 января 2011

return оператор может появляться везде в методе или конструкторе.

должно сопровождаться значением, совместимым с типом возвращаемого значения метода.Если метод void, return ничего не возвращает.

Конструкторы вообще не имеют возвращаемого типа (по определению).Поэтому, если вы пишете оператор возврата в конструктор, за ним не должно следовать никакого значения.

0 голосов
/ 16 марта 2011

Я предпочитаю иметь только один оператор возврата в методе и не иметь оператора возврата в конструкторе.Еще один уровень отступа - часто тривиальная вещь, которую нужно принять в сравнении с тем, что вы получаете из этой лучшей практики.Это часто делает код намного более читабельным.Если у меня есть локальная переменная для значения, которое возвращается в конце, это часто дает мне возможность объявить эту переменную как окончательную, так что я могу быть абсолютно уверен, что переменная назначается только один раз.Часто это дает некоторое представление о реальной сложности вашего алгоритма.Тем не менее, я использую несколько операторов throws внутри метода.Также я предпочитаю иметь Проект по контракту с предварительными условиями, проверяемыми в начале метода и указанными в javadoc.

0 голосов
/ 31 января 2011

Я не уверен, где именно могут использоваться операторы возврата (или что именно говорит спецификация). Они чаще всего используются в методах для возврата значений (или для завершения методов без возвращаемого значения).

Конструкторы не могут возвращать никаких значений. При вызове конструктора виртуальная машина выделяет память для размера создаваемого вами объекта, а затем вызывает соответствующий конструктор внутри объекта, который отличается от процесса вызова метода. Оператор return может быть в состоянии использоваться, но никакое значение не может быть возвращено из самого конструктора.

Чтобы «вернуть» информацию из конструктора (точнее, указать, что что-то не так во время конструирования), вместо этого можно использовать исключения.

0 голосов
/ 31 января 2011

Вы можете использовать return без значения в методе с типом возврата void. В других методах это невозможно.

Например

    public void test(String s) {
       if (s.equals("")) {
          return;
       }
    }

Конструктор не должен иметь оператора return внутри своего тела, поскольку конструктор не имеет возвращаемого типа по определению.

РЕДАКТИРОВАТЬ: Как указал Джон Скит, конструкторы могут иметь операторы возврата без значений, но в большинстве случаев это не используется.

...