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

2022-08-31 19:44:55

这是我的代码。

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

谢谢。


答案 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. 对本地类的限制

本地课程受以下限制:

  • 局部类仅在定义它的块中可见;它永远不能在该块之外使用。

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

  • 与成员类一样,出于同样的原因,本地类不能包含静态字段、方法或类。唯一的例外是同时声明为静态和 final 的常量。

  • 无法在本地定义接口。

  • 局部类(如成员类)不能与其任何封闭类具有相同的名称。

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

因此,如您所见,在这些情况下,您的第一个选项(没有嵌套方法)是可取的。


答案 2

很简单-不。不能将一个方法嵌套在另一个方法中。

如果你真的想这样做,你可以在方法中定义(奇怪的是,考虑到前面的限制),因此可以将你的方法包装在外部方法内的一个类中。

但是,这并不是很习惯用语,一般的做法似乎是有一个私有方法列表(在顶级类中),也许根据目的分组,并用注释块来划分组。


但是,如果您碰巧发现自己在使用Scala,则可以将方法嵌套到您的内心内容中......