Enum의 values ​​() 메서드에 대한 설명서는 어디에 있습니까?


172

열거 형을 다음과 같이 선언합니다.

enum Sex {MALE,FEMALE};

그런 다음 아래와 같이 열거 형을 반복하십시오.

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

Java API를 확인했지만 values ​​() 메소드를 찾을 수 없습니까? 이 방법의 출처가 궁금합니다.

API 링크 : https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html

답변:


178

이 메소드는 컴파일러에 의해 추가 되었기 때문에 javadoc에서 볼 수 없습니다.

세 곳에서 문서화 됨 :

컴파일러는 열거 형을 만들 때 자동으로 몇 가지 특수한 방법을 추가합니다. 예를 들어, 선언 된 순서대로 열거 형의 모든 값을 포함하는 배열을 반환하는 정적 값 메서드가 있습니다. 이 메소드는 일반적으로 for-each 구문과 함께 사용하여 열거 형 유형의 값을 반복합니다.

  • Enum.valueOf클래스
    (특별 암시 적 values메소드는 valueOf메소드 설명에 언급되어 있음 )

열거 형의 모든 상수는 해당 형식의 암시적인 public static T [] values ​​() 메서드를 호출하여 얻을 수 있습니다.

values함수는 단순히 열거의 모든 값을 나열합니다.


6
이것에 대한 특별한 이유가 있습니까? 왜 API의 일부가 아닌가?
rai.skumar

10
열거 형없이 표준 메커니즘 만 사용하기 때문에이 정적 메서드를 사용할 수 없습니다. 이러한 열거를 허용하도록 Java 스펙을 확장해야했기 때문에 컴파일러가이를 추가해야합니다.
Denys Séguret

4
Java 7부터는 정적 valuOf 메소드의 설명에서 java.lang.Enum의 javadoc에 추가되었습니다.
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가 없거나 코드가 컴파일러에 의해 생성된다는 것을 의미합니까? 저는 EnumOpenJDK 소스 코드를 확인했지만 없습니다values()
Marco Sulla

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. 섹스를 클래스 이름으로 사용하지 마십시오. 코드를 읽기가 어렵습니다. Java에서 Sex를 사용합니다.

  2. 이와 같은 Java 퍼즐에 직면 할 때 바이트 코드 디 컴파일러 도구를 사용하는 것이 좋습니다 (Andrey Loskutov의 바이트 코드 개요 Eclispe 플러그인 사용). 이것은 수업 안에있는 모든 것을 보여줄 것입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.