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

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

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



답변

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

세 곳에서 문서화 됨 :

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

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

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

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


답변

이 메소드는 암시 적으로 정의됩니다 (즉, 컴파일러에 의해 생성됨).

로부터 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);

답변

이것을 실행

    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 플러그인 사용). 이것은 수업 안에있는 모든 것을 보여줄 것입니다


답변