我最近在我正在处理的现有代码库中运行了以下代码段,并添加了您在那里看到的注释.我知道这段特殊的代码可以重写为更清晰,但我只是想知道我的分析是否正确.
java会创建一个新的类声明并将其存储在perm gen空间中,以便每次调用此方法,还是会知道重用现有的声明?
protected List<Object> extractParams(HibernateObjectColumn column, String stringVal) {
// FIXME: could be creating a *lot* of anonymous classes which wastes perm-gen space right?
return new ArrayList<Object>() {
{
add("");
}
};
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*and 16
该类只编译一次(在编译时).编译器提取一个类(类似名称MyOuterClass$1)并使用它.当然,它会创建多个实例,但它们都属于同一个类.您可以看到,当您编译.java文件并查看.class生成的文件时 - 内部匿名类将有一个文件.
不,这会创建一个单一类的许多实例.要测试,请将它放在匿名类中:
@Override
public String toString() {
return getClass().getName();
}
Run Code Online (Sandbox Code Playgroud)
然后调用toString()匿名类的各种实例.你会看到他们都返回相同的类名.