声明许多相同的匿名类会浪费java中的内存吗?

dep*_*her 10 java

我最近在我正在处理的现有代码库中运行了以下代码段,并添加了您在那里看到的注释.我知道这段特殊的代码可以重写为更清晰,但我只是想知道我的分析是否正确.

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生成的文件时 - 内部匿名类将有一个文件.


Chr*_*ung 5

不,这会创建一个单一类的许多实例.要测试,请将它放在匿名类中:

@Override
public String toString() {
    return getClass().getName();
}
Run Code Online (Sandbox Code Playgroud)

然后调用toString()匿名类的各种实例.你会看到他们都返回相同的类名.