2013-08-25 1 views
3

Ранее вместо перечислений, я хотел бы сделать что-то вроде:Как работает функция однократного переименования?

public static ExampleClass instance; 

public ExampleClass(){ 
    instance=this; 
} 

public static ExampleClass getInstance(){ 
    return instance; 
} 

Тогда кто-то сказал мне о перечислений одноточечного:

public enum Example{ 
INSTANCE; 

public static Example getInstance(){ 
     return Example.INSTANCE; 
} 

В первом примере я должен был создать экземпляр объекта для того, чтобы создайте экземпляр. С перечислением мне не нужно это делать ... по крайней мере, это появляется. Может кто-нибудь объяснить причину этого?

ответ

6

Компилятор Java заботится о создании полей enum как статических экземпляров класса Java в байт-коде. Великий пост в блоге на нем (не мой блог) с байткод здесь: http://boyns.blogspot.com/2008/03/java-15-explained-enum.html

+0

Я всегда задавался вопросом, как это сработало. благодаря – Jaccob

5

Если разбирать перечисление/класс после того, как вы собираете с-

javap Пример

Вы Get-

Compiled from "Example.java" 
public final class Example extends java.lang.Enum<Example> { 
    public static final Example INSTANCE; 
    public static Example[] values(); 
    public static Example valueOf(java.lang.String); 
    public static Example getInstance(); 
    static {}; 
} 

Как вы можете видеть INSTANCE является публичным статическим конечным полем Пример класс.

Если разобрать EmployeeClass, вы get-

public class ExampleClass { 
    public static ExampleClass instance; 
    public ExampleClass(); 
    public static ExampleClass getInstance(); 
} 

ли вы сейчас видите разницу? Это по сути то же самое с незначительными отличиями.

1

Я предлагаю прочитать Item 3: Enforce the singleton property with a private constructor or an enum type from Effective Java Джошуа Блох, который объясняет, как это работает и почему использовать перечисление в качестве Singleton.

Смежные вопросы