Java:从Singleton Holder模式生成多个内部类

Java:从Singleton Holder模式生成多个内部类,java,eclipse,maven,singleton,Java,Eclipse,Maven,Singleton,我有一个非常简单的使用holder模式的singleton(我只展示了模式,没有其他细节): 当我通过Eclipse1.6编译器编译这个类时,它会生成两个类:Foo.class和Foo$FooHolder.class。但是当我通过Maven和jdk1.6编译器编译它时,它会生成一个额外的类:Foo$1.class,这个类几乎是空的 我想知道为什么会这样。由于限制,我无法提供有关代码的更多详细信息。虽然java允许访问同一中其他类的私有成员。javaJVM不支持这一点 相反,编译器生成代码,通过生

我有一个非常简单的使用holder模式的singleton(我只展示了模式,没有其他细节):

当我通过Eclipse1.6编译器编译这个类时,它会生成两个类:
Foo.class
Foo$FooHolder.class
。但是当我通过
Maven
jdk1.6编译器
编译它时,它会生成一个额外的类:
Foo$1.class
,这个类几乎是空的


我想知道为什么会这样。由于限制,我无法提供有关代码的更多详细信息。

虽然java允许访问同一
中其他类的私有成员。java
JVM不支持这一点

相反,编译器生成代码,通过生成的访问器方法(如access$010()或生成的子类)对这些成员进行秘密访问。每个编译器的具体工作方式是一个实现细节

我非常肯定Oracle JDK 7不会这样做


顺便说一句,使用枚举可以更简单,创建更少的类

如果您使用Eclipse编译器,那么您使用的是不同的编译器,正如您可能通过JDK 1.6在Maven中使用的那样…(取决于您所配置的)…没有pom文件等。很难猜测…尝试将字段
实例
的访问更改为默认而不是私有。你还得到额外的类吗?不,
javac
1.6.0_65版没有复制你的报告。@MarkoTopolnik是的,最有可能的情况是额外的匿名内部类来自我们不允许看到的代码部分。@biziclop I使内部类和字段默认值都可以访问,然后字段默认为可访问且内部类为private,但它仍然为这两种情况生成了额外的类。
public class Foo
{
    private static class FooHolder
    {
        private static final Foo INSTANCE = new Foo();
    }

    public static Foo getInstance()
    {
        return FooHolder.INSTANCE;
    }
}