java - 本地类的用法、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();
}
}
解决方案
任何形式的嵌套类都会被编译成一个名称混乱的类。您可以在完成其业务后查看这些.class
文件。javac
以前对私有成员的访问是通过默认(“包”)访问完成的,以使其适合 JDK1.0 模型。最近,JVM 获得了嵌套的概念。
将代码示例作为 lambda 函数可能会更好。即使是匿名内部类也会更好。
推荐阅读
- go - go-routines 的协调和优雅的关闭
- r - 错误:glm.fit:出现数字 0 或 1 的拟合概率
- r - 如何在不接收无效字符错误的情况下聚合字符和数值
- c - 如何将 GtkEntry 小部件设置为仅使用 C 接受数字?
- python - TypeError:尝试求解二次多项式时,无法将序列乘以“numpy.float64”类型的非整数
- javascript - 如何将 WMTS 图层添加到 Openlayers 地图
- javascript - 我的 App.js 看起来与教程中的不一样。它不包含一个类,只是一个函数。做错了什么?
- python - 在python中从视频中提取音频
- python - 传递 Dataset.from_tensor_slices 列表与元组
- javascript - 根据特定条件为不同的变量赋值