Ответ 1
Обновление 2014-02-09:
JDK 8 представил lambdas (анонимные функциональные выражения), которые позволяют вам решить это следующим образом:
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. Ограничения на локальные классы
Локальные классы подчиняются следующим ограничениям:
Локальный класс отображается только внутри блока, который его определяет; он никогда не может использоваться вне этого блока.
Локальные классы не могут быть объявлены общедоступными, защищенными, частными или статическими. Эти модификаторы предназначены для членов классов; они не допускаются с объявлениями локальных переменных или объявлениями локального класса.
Как и классы-члены, и по тем же причинам локальные классы не могут содержать статические поля, методы или классы. Единственное исключение - для констант, объявленных как статическими, так и окончательными.
Интерфейсы не могут быть определены локально.
Локальный класс, как класс-член, не может иметь то же имя, что и любой из его вмещающих классов.
Как отмечалось ранее, локальный класс может использовать локальные переменные, параметры метода и даже параметры исключения, которые находятся в его области действия, но только если эти переменные или параметры объявлены окончательными. Это связано с тем, что время жизни экземпляра локального класса может быть намного длиннее, чем выполнение метода, в котором определяется класс. По этой причине локальный класс должен иметь частную внутреннюю копию всех локальных переменных, которые он использует (эти копии автоматически генерируются компилятором). Единственный способ гарантировать, что локальная переменная и частная копия всегда одинаковы, - настаивать на том, что локальная переменная является окончательной.
Итак, как вы можете видеть, ваш первый вариант (без вложенных методов) предпочтительнее в этих ситуациях.