Java是否支持inner / local / sub方法?
这是我的代码。
public class SubFunction { private String drawTribleX(){ return trible("X"); } private String trible(String t){ return t + t + t; } public static void main(String[] args){ SubFunction o = new SubFunction(); System.out.println(o.drawTribleX()); } }
我可以做这样的事吗?
public class SubFunction { private String drawTribleX(){ // *** move trible(t) inside drawTribleX() *** private String trible(String t){ return t + t + t; } return trible("X"); } public static void main(String[] args){ SubFunction o = new SubFunction(); System.out.println(o.drawTribleX()); } }
谢谢。
更新2014-02-09:
JDK 8引入了lambdas(匿名函数expression式),它允许你像这样解决它:
Function<String, String> trible = s -> s+s+s; System.out.println(trible.apply("X")); // prints XXX
(JDK 7及以下)
不,Java不支持“直接”嵌套方法。 (尽pipe大多数函数式语言,包括一些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。 对本地类的限制
本地课程受以下限制:
本地类只在定义它的块内可见; 它永远不能在该块之外使用。
本地类不能被声明为public,protected,private或static。 这些修饰符是为类的成员; 他们不允许使用局部variables声明或局部类声明。
像成员类一样,出于同样的原因,本地类不能包含静态字段,方法或类。 唯一的例外是声明为静态和最终的常量。
接口不能在本地定义。
一个本地类,像一个成员类,不能和它的任何封闭类具有相同的名字。
如前所述,本地类可以使用其范围内的局部variables,方法参数,甚至是exception参数,但前提是这些variables或参数被声明为最终的。 这是因为本地类的实例的生命周期可能比定义该类的方法的执行时间长得多。 因此,本地类必须拥有所有使用的局部variables的私有内部副本(这些副本由编译器自动生成)。 确保局部variables和私人副本始终相同的唯一方法是坚持局部variables是最终的。
所以,正如你所看到的,你的第一个select(没有嵌套方法)在这些情况下更可取。
很简单 – 不。 您不能在另一个方法中嵌套一个方法。
如果你真的想这样做,你可以在方法中定义类 (奇怪的是,给定了前面的限制),所以可以在外部方法的类中包装你的方法。
然而,这不是很习惯,一般的做法似乎是有一个私人方法列表(在顶级类),也许根据目的分组,并与评论块划分群体。
如果您碰巧发现自己在使用Scala,那么您可以将方法embedded到您的心中。
你也可以尝试这种匿名的内部类。
public class SubFunction { private String drawTribleX() { // *** move trible(t) inside drawTribleX() *** Trible t = new Trible() { public String trible(String t) { return t + t + t; } }; return t.trible("X"); } public static void main(String[] args) { SubFunction o = new SubFunction(); System.out.println(o.drawTribleX()); } interface Trible { String trible(String t); } }
你可以使用匿名类。 像这样的东西;
class SubFunction { public static void main(String[] args) { SubFunction o = new SubFunction(); System.out.println(o.drawTribleX()); } private String drawTribleX() { MyTrible trible = new MyTrible() { @Override public String doTrible(String t) { return t + t + t; } }; return trible.doTrible("X"); } private interface MyTrible { public String doTrible(String t); } }
如果你想要的话,你可以使用相同的接口定义不同types的操作,并将它们传递给你。