2014-06-09 5 views
-1

Пожалуйста, взгляните на Synthetic Arguments. Конструкторы Enum имеют два дополнительных синтетических аргумента.Java enum синтетические аргументы для конструкторов

Пожалуйста, смотрите раздел:

Другой пример: классы Java перечислений

Как вы можете видеть, это экономит довольно много кода, но также добавляет синтетические поля, методы и параметры конструктора. Если вы определили свой собственный конструктор с собственным набором параметров.

Может ли быть ситуация, когда конструктор перечисления не имеет синтетических аргументов.

Извините, что не предоставил достаточно деталей.

+0

Я не могу найти синтетических аргументов в этой статье. Рассмотрите возможность редактирования вопроса с помощью соответствующего примера, чтобы мы знали, о чем ваш вопрос на самом деле. – Pshemo

+0

@Pshemo информация * есть * там, но я согласен, что довольно сложно читать длинную статью, чтобы понять вопрос. Пример кода, представленный в этом вопросе, для меня мало смысла. –

ответ

0

Прочитав статью, я бы сказал, что ответ отрицательный. В статье объясняется, что типичное перечисление таких как:

enum Colours { 
    RED, BLUE; 
} 

становится:

final class Colours extends java.lang.Enum { 
    public final static Colours RED = new Colours("RED", 0); 
    public final static Colours BLUE = new Colours("BLUE", 1); 

    private final static values = new Colours[]{ RED, BLUE }; 

    private Colours(String name, int sequence){ 
     super(name, sequence); 
    } 

    public static Colours[] values(){ 
     return values; 
    } 

    public static Colours valueOf(String name){ 
     return (Colours)java.lang.Enum.valueOf(Colours.class, name); 
    } 
} 

где аргументы к Colours конструктора считаются синтетический (т.е. они были произведены компилятором, чтобы сделать уверенный "материал работает"). Поэтому кажется, что синтетические аргументы неизбежны, поскольку они являются необходимой частью перевода enum в настоящий класс.

Единственная возможность заключается в том, что перечисление не имеет значений - действительно ли Java создает синтетические поля? Интуитивно, ответ - да. Это подтверждается статьей в документе , но почему меня это должно волновать? раздел. Здесь автор показывает, что пустое перечисление по-прежнему имеет число параметров, равное двум, если смотреть с отражением.

0

Проверьте исходный код параллельного класса TimeUnit. Это перечисление со своими собственными методами. Вы можете работать с перечислениями, как если бы они были сами собой.

http://fuseyism.com/classpath/doc/java/util/concurrent/TimeUnit-source.html

Вот пример моего:

public enum ExampleEnum { 
    ENUM_1 ("ENUM_1", 1, Color.GREEN) { 
     @Override 
     public void doMethingWeird(String stringToEnum) { 
      //Implementation goes here; 
     } 
    }, 
    ENUM_2 ("ENUM_2", 2, Color.BLACK) { 
     @Override 
     public void doMethingWeird(String stringToEnum) { 
      //Implementation goes here; 
     } 
    }, 
    ENUM_3 ("ENUM_3", 3, Color.WHITE){ 
     @Override 
     public void doMethingWeird(String stringToEnum) { 
      //Implementation goes here; 
     } 
    }; //Don't forget the semicolon ';' after the enums, to separate them from the methods; 

    //You can have static constants; 
    private static final Object object = new Object(); 

    private final String enumName; 
    private final int enumNumber; 
    private final Color enumColor; //why not? 

    //CONSTRUCTOR IT MUST BE PRIVATE 
    private Effect(String enumName, int enumNumber, Color enumColor){ 
      this.enumName = enumName; 
      this.enumNumber = enumNumber; 
      this.enumColor = enumColor; 
    } 

    //you can have abstract methods and implement them on the enums. 
    public abstract void public void doMethingWeird(String stringToEnum); 

    public String getEnumName() { 
      return enuName; 
    } 

    public int getEnumNumber() { 
      return enumNumber; 
    } 

    public Color getEnumColor() { 
      return enumColor; 
    } 
} 

Я надеюсь, что я помог.

+0

Я имел в виду «doSomethingWeird», а не «doMethingWeird». Но я надеюсь, что это поможет. – saclyr

0

Я столкнулся с той же проблемой, имея перечисление с конструкторами деревьев и параметрами. Выполняя рефлексию и получая параметры конструкторов, вы получаете String и int extra в качестве первых 2 параметров. Мне было интересно, откуда они пришли. После отладки я узнал, что класс Enum имеет защищенный конструктор, который использует первые 2 параметра.

Я сделал тест, добавив конструктор без параметров, и добавлены еще 2 дополнительных параметра.

код из Enum.java с конструктором:

/** 
* Sole constructor. Programmers cannot invoke this constructor. 
* It is for use by code emitted by the compiler in response to 
* enum type declarations. 
* 
* @param name - The name of this enum constant, which is the identifier 
*    used to declare it. 
* @param ordinal - The ordinal of this enumeration constant (its position 
*   in the enum declaration, where the initial constant is assigned 
*   an ordinal of zero). 
*/ 
protected Enum(String name, int ordinal) { 
    this.name = name; 
    this.ordinal = ordinal; 
} 

Чтобы обнаружить эту ситуацию, вы можете использовать метод isEnum() отраженного конструктора, и пропустить 2 параметра.

Constructor<?> constructor; 

private boolean isEnum() { 
    return constructor.getDeclaringClass().isEnum(); 
}