首页 > 解决方案 > 本地类的用法、Javac 翻译和运行时行为

问题描述

我偶尔会使用一种实现模式(或成语),其中接口的具体实现被封装为工厂方法中的本地类,我对这是一种不好的做法还是有效的做法感兴趣?javac 究竟如何处理本地类?本地课程是否提升到顶级水平?不幸的是,IntelliJ 无法为此显示任何字节码。此外,我会对动态感兴趣。对运行时机制(如动态类层次结构分析)和 JIT 编译是否有任何负面影响?

interface Transformer<A, B> extends Function<Iterable<A>, Iterable<B>> {

    @Override
    Iterable<B> apply(Iterable<A> itr);

    /// FACTORIES.

    /** Creates an transformer according to approach X. */
    static <A, B> Transformer<A, B> makeX(/* X specific params */) {
        final class TX implements Transformer<A, B> {
            @Override
            public Iterable<B> apply(Iterable<A> itr) {
                // ... X-style impl.
            }
        }
        return new TX();
    }

    /** Creates an transformer according to approach Y. */
    static <A, B> Transformer<A, B> makeY(/* Y specific params */) {
        final class TY implements Transformer<A, B> {
            @Override
            public Iterable<B> apply(Iterable<A> itr) {
                // ... Y-style impl.
            }
        }
        return new TY();
    }
}

标签: java

解决方案


任何形式的嵌套类都会被编译成一个名称混乱的类。您可以在完成其业务后查看这些.class文件。javac以前对私有成员的访问是通过默认(“包”)访问完成的,以使其适合 JDK1.0 模型。最近,JVM 获得了嵌套的概念。

将代码示例作为 lambda 函数可能会更好。即使是匿名内部类也会更好。


推荐阅读