一尘不染

Java是否支持内部/本地/子方法?

java

这是我的代码。

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());
    }
}

谢谢。


阅读 249

收藏
2020-09-08

共1个答案

一尘不染

更新2014年2月9日:

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。 本地班级限制

本地课程受以下限制:

  • 本地类仅在定义它的块内可见;它永远不能在该块之外使用。

  • 本地类不能声明为公共,保护,私有或静态。这些修饰符用于类的成员;局部变量声明或局部类声明不允许使用它们。

  • 类似于成员类,并且出于相同的原因,局部类不能包含静态字段,方法或类。唯一的例外是声明为static和final的常量。

  • 接口不能在本地定义。

  • 像成员类一样,本地类不能与其任何封闭类具有相同的名称。

* 如前所述,局部类可以使用其范围内的局部变量,方法参数甚至异常参数,但前提是必须将这些变量或参数声明为final。这是因为本地类实例的生存期可能比定义该类的方法的执行时间更长。因此,本地类必须具有其使用的所有本地变量的私有内部副本(这些副本由编译器自动生成)。确保局部变量和私有副本始终相同的唯一方法是坚持认为局部变量是最终变量。

因此,如您所见,在这些情况下,首选第一个选项(无嵌套方法)。

2020-09-08