У меня довольно простой синглтон, который использует шаблон держателя (я показал только шаблон, а не другие детали):
public class Foo
{
private static class FooHolder
{
private static final Foo INSTANCE = new Foo();
}
public static Foo getInstance()
{
return FooHolder.INSTANCE;
}
}
Когда я компилирую этот класс через Eclipse 1.6 compiler
, он генерирует два класса: Foo.class
и Foo$FooHolder.class
. Но когда я компилирую его с помощью Maven
и JDK 1.6 compiler
, он генерирует дополнительный класс: Foo$1.class
и этот класс довольно пуст.
Я пытаюсь понять, почему это происходит. Я не могу предоставить более подробную информацию о коде из-за ограничений.
В то время как Java позволяет получить доступ к закрытым членам других классов в том же .java
виртуальная машина не поддерживает это.
Вместо этого компилятор генерирует код, который предоставляет секретный доступ к этому элементу через сгенерированные методы доступа, например, доступ к $ 010() или сгенерированным подклассам. Именно то, как каждый компилятор делает это, является детальностью реализации.
Я уверен, что Oracle JDK 7 этого не делает.
Btw, используя Enum, вместо этого мир будет проще и создать меньше классов.
INSTANCE
по умолчанию вместо частного. Вы все еще получаете дополнительный класс?