Обновление 2014-02-09:
JDK 8 введены лямбда-выражения (выражения анонимных функций), которые позволяют решить эту проблему следующим образом:
Function<String, String> trible = s -> s+s+s;
System.out.println(trible.apply("X")); // prints XXX
(JDK 7 и ниже)
Нет, Java не поддерживает "напрямую" вложенные методы.(Однако большинство функциональных языков, включая некоторые языки JVM, такие как Scala и Clojure!)
Только для справки;Вы можете определять локальные классы (классы внутри методов), так что компилирует
class SubFunction {
private String drawTribleX(){
// *** move trible(t) inside drawTribleX() ***
class Trible {
private String trible(String t){
return t + t + t;
}
}
return new Trible().trible("X");
}
public static void main(String[] args){
SubFunction o = new SubFunction();
System.out.println(o.drawTribleX());
}
}
Обратите внимание, что существуют некоторые ограничения для локальных классов
3.11.2. Ограничения на локальные классы
На локальные классы распространяются следующие ограничения:
Локальный класс виден только в пределах блока, который его определяет;его нельзя использовать вне этого блока.
Локальные классы не могут быть объявлены как публичные, защищенные, частные или статические.Эти модификаторы предназначены для членов классов;они не допускаются для объявлений локальных переменных или объявлений локальных классов.
Как и классы-члены, и по тем же причинам локальные классы не могут содержать статические поля, методы или классы.Единственное исключение - константы, объявленные как статические, так и конечные.
Интерфейсы не могут быть определены локально.
Локальный класс, такой каккласс-член не может иметь того же имени, что и любой из его окружающих классов.
Как отмечалось ранее, локальный класс может использовать локальные переменные, параметры метода и даже параметры исключения, которые находятся вего область действия, но только если эти переменные или параметры объявлены окончательными.Это связано с тем, что время жизни экземпляра локального класса может быть намного больше, чем выполнение метода, в котором определен класс.По этой причине локальный класс должен иметь закрытую внутреннюю копию всех локальных переменных, которые он использует (эти копии автоматически генерируются компилятором).Единственный способ убедиться, что локальная переменная и личная копия всегда одинаковы, это настаивать на том, что локальная переменная является конечной.
Итак, как вы можете видеть, вашаПервый вариант (без вложенных методов) предпочтителен в этих ситуациях.