Могут методы в Java быть вложенными и каков эффект? [закрытый]

25
задан David 14 April 2010 в 01:33
поделиться

6 ответов

ОБНОВЛЕНИЕ Поскольку методы Java 8 могут быть вложены с использованием лямбда-выражений, см. этот другой вопрос .

Этот ответ действителен для версий Java до Java 8

Далее следует исходный ответ:

Могут ли методы в java быть вложенными [...]?

Нет, это невозможно.

Ближайшее, что вы можете получить, это:

class Name {
    void methodOne() {
        class InnerClass {
           void methodTwo() {
           }
         }
     }
 }

То есть второй метод, определенный во внутреннем классе, определенном в методе.

Вы можете объявить метод статическим внутри внутреннего класса, поэтому вам не нужно вызывать new

43
ответ дан 28 November 2019 в 18:19
поделиться

Это недопустимый синтаксис; такая функция не поддерживается. (Хотя это рассматривается для Java 7)

Вместо этого вы можете использовать вложенные классы, о которых вы только что спросили .

13
ответ дан 28 November 2019 в 18:19
поделиться

Не проверяя, я бы сказал, что это не принимается компилятором, потому что на данный момент методы должны быть определены внутри класса. Однако вы можете определить внутренний класс внутри метода (см. «Локальные и анонимные внутренние классы»).

http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html

2
ответ дан 28 November 2019 в 18:19
поделиться

Нет.

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

Еще одна вещь, которую вы могли бы рассмотреть - и которая, кажется, не широко известна среди программистов, - это то, что вы можете объявить любой произвольный блок области видимости и пометить его, а затем использовать break для выхода из этого блока.

Итак, следующее является совершенно законным для Java:

void method() {
      myInnerMethod : {
        // do some stuff

        if (condition) {
            break myInnerMethod;
        }

        // do some more stuff
      }
}

Конечно, блок области видимости на самом деле не является методом, но в некоторых случаях его можно использовать для выполнения того, для чего вам нужен «внутренний метод».

5
ответ дан 28 November 2019 в 18:19
поделиться

Не поддерживается на Java. Похоже, вы хотите выполнить рекурсию, просто вызовите тот же метод еще раз.

method(){

  method();

}
-2
ответ дан 28 November 2019 в 18:19
поделиться

Нет. Это неверный синтаксис. И это досадно - это одна из вещей, по которой мне не хватает Ады. Отсутствие возможности определять вложенные методы действительно создает множество проблем при организации классов с большим количеством частных методов. Отсюда скользкий спуск в землю, где нет сплоченности.

Вы можете использовать вложенные классы, но они имеют свою цену. Каждый вложенный класс создает класс с именем $ named. У каждого есть свои дескрипторы с точки зрения открытых файлов (если они не извлечены из архива), а также памяти, занятой определением его класса. Некоторые системы имеют ограничение на количество файлов (то есть общее количество сгенерированных классов), которые они могут развернуть (например, Google Apps.)

Другими словами, я бы не стал использовать вложенные классы для имитации вложенных методов (на всякий случай, если вы решите попробовать это.)

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

Это позволит вам организовать ваши методы и алгоритмы во вложенных пространствах имен. При разумном использовании вложенные методы действительно помогают в организации кода.

3
ответ дан 28 November 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: