Де знаходиться документація для методу значень () Enum?


172

Я оголошую перелік як:

enum Sex {MALE,FEMALE};

А потім повторіть перерахунок, як показано нижче:

for(Sex v : Sex.values()){
    System.out.println(" values :"+ v);
}

Я перевірив Java API, але не можу знайти метод значень ()? Мені цікаво, звідки береться цей метод?

Посилання API: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html

Відповіді:


178

Ви не можете побачити цей метод у javadoc, оскільки його додає компілятор.

Документовано в трьох місцях:

  • Види Enum , з навчальних посібників Java

Компілятор автоматично додає деякі спеціальні методи, коли створює перерахунок. Наприклад, у них є метод статичних значень, який повертає масив, що містить усі значення перерахунку в порядку, в якому вони оголошені. Цей метод зазвичай використовується в поєднанні з конструктом для кожного для перебору значень типу enum.

  • Enum.valueOfклас
    (спеціальний неявний valuesметод згадується в описі valueOfметоду)

Всі константи типу enum можна отримати, викликавши неявний публічний статичний T [] значення () методу цього типу.

valuesФункція просто перерахувати всі значення перерахування.


6
якась конкретна причина цього? чому це не частина API?
rai.skumar

10
Оскільки, використовуючи лише стандартний механізм (без enum), ви не могли б використовувати цей статичний метод. Специфікацію java довелося розширити, щоб дозволити цим перелікам, тому її повинен додати компілятор.
Denys Séguret

4
Оскільки Java 7 це було додано до javadoc програми java.lang.Enum, в описі статичного методу valueOf.
Catweazle

3
Чи створює виклик "values ​​()" новий масив, чи він повторно використовує той самий?
андроїд розробник

3
@androiddeveloper він повертає новий масив (інакше ви можете зіпсуватись із перерахунком)
Denys Séguret

35

Метод неявно визначений (тобто генерується компілятором).

Від JLS :

Крім того, якщо Eце ім'я enumтипу, то цей тип має такі неявно задекларовані staticметоди:

/**
* Returns an array containing the constants of this enum 
* type, in the order they're declared.  This method may be
* used to iterate over the constants as follows:
*
*    for(E c : E.values())
*        System.out.println(c);
*
* @return an array containing the constants of this enum 
* type, in the order they're declared
*/
public static E[] values();

/**
* Returns the enum constant of this type with the specified
* name.
* The string must match exactly an identifier used to declare
* an enum constant in this type.  (Extraneous whitespace 
* characters are not permitted.)
* 
* @return the enum constant with the specified name
* @throws IllegalArgumentException if this enum type has no
* constant with the specified name
*/
public static E valueOf(String name);

Added by the compilerозначає, що для цього коду немає .java або код генерується компілятором? Я перевірив вихідний код OpenJDK Енума, і немаєvalues()
Марко Сулла

12

Виконати це

    for (Method m : sex.class.getDeclaredMethods()) {
        System.out.println(m);
    }

ти побачиш

public static test.Sex test.Sex.valueOf(java.lang.String)
public static test.Sex[] test.Sex.values()

Це все публічні методи, якими володіє клас "секс". Їх немає у вихідному коді, javac.exe додав їх

Примітки:

  1. ніколи не використовуйте секс як назву класу, важко читати ваш код, ми використовуємо Sex на Java

  2. стикаючись з такою головоломкою Java, я рекомендую використовувати інструмент декомпіляції байт-коду (я використовую плагін байт-коду Андрія Лоскутова Eclispe). Це покаже все, що знаходиться в класі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.