Подтвердить что ты не робот

Могут ли методы в java быть вложенными и каков эффект?

например, и является ли это законным:

class NAME {
method {
     method {} 
}
} 

и каков был бы эффект? есть ли какой-либо специальный синтаксис?

4b9b3361

Ответ 1

UPDATE Поскольку методы Java 8 могут быть вложены с помощью lambdas, см. этот другой вопрос.

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

Оригинальный ответ:

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

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

Самое близкое, что вы можете получить, это:

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

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

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

Ответ 2

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

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

Ответ 3

Нет.

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

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

Итак, совершенно законная Java:

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

        if (condition) {
            break myInnerMethod;
        }

        // do some more stuff
      }
}

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

Ответ 4

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

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

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

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

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

Ответ 5

Без проверки, я бы сказал, что это не принято компилятором, потому что с этого времени методы должны быть определены внутри класса. Тем не менее, вы можете определить внутренний класс внутри метода (см. "Локальные и анонимные внутренние классы" ).

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

Ответ 6

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

method(){

  method();

}