programing

메서드에서 열거 형을 로컬로 선언 할 수없는 이유는 무엇입니까?

procenter 2021. 1. 15. 19:44
반응형

메서드에서 열거 형을 로컬로 선언 할 수없는 이유는 무엇입니까?


오늘 저는 이런 코딩을하고있는 제 자신을 발견했습니다 ...

public class LocalEnums {

    public LocalEnums() {
    }

    public void foo() {
        enum LocalEnum {
            A,B,C
        };

        // ....
        // class LocalClass { }

    }
}

컴파일러가 로컬에서 오류를보고했을 때 나는 약간 놀랐습니다 enum.

멤버 enum LocalEnum은 로컬 일 수 없습니다.

열거 형을 클래스 처럼 지역적으로 선언 할 수없는 이유는 무엇 입니까?

나는 이것이 특정 상황에서 매우 유용하다는 것을 알았습니다. 내가 일하는 경우 나머지 코드는 enum.

이것이 불가능한 이유를 설명 하는 구조 / 디자인 충돌이 있거나 이것이 Java 향후 기능 이 될 수 있습니까?


열거 정적 중첩 클래스이다 그들이 때문에 정적 멤버 변수 (열거 값)를 정의 하고, 이것이 내부 클래스 허용 : http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html # jls-8.1.3

업데이트 : 정적 중첩 클래스의 제한 사항에 대한 자세한 내용 JLS( 자바 언어 사양 )을 살펴보고 찾지 못했습니다 (아마도 거기에 있지만 다른 주제 아래에 숨겨져 있음). 순수한 구현 관점에서 이것이 불가능할 이유가 없습니다. 그래서 나는 그것이 언어 철학 문제라고 생각합니다. 그렇게해서는 안되며 따라서 지원되지 않을 것입니다. 그러나 나는 거기에 없었기 때문에 그것은 순수한 추측입니다.

주석으로 : 메서드가 자체 열거 형을 요구할만큼 충분히 크면 리팩토링이 필요하다는 강력한 신호입니다.


익명의 내부 클래스가 아닌 한 메서드 내에서 유형을 작성하는 경우는 거의 없습니다 . 그러나 중첩 된 열거 형을 작성할 수 있습니다.

public class NestedEnum
{
    private enum MyEnum
    {
        X, Y, Z
    }

    public void foo()
    {
    }
}

새로운 유형을 선언 한 메소드를 실제로 읽고 싶지 않다고 생각 합니다. 중첩 유형이 아닌 메소드 내에서 선언하려는 구체적인 이유가 있습니까? "다른 메소드는 알 필요가 없다"라는 주장을 볼 수 있지만 주석으로 분류 할 수 있고 여전히 더 읽기 쉬운 코드를 남길 수 있다고 생각합니다.


  1. "중첩 된 열거 형 유형은 암시 적으로 정적입니다." 8.9 열거 형

  2. 중첩 된 열거 형 유형에 정적 액세스 수정자가 암시 적으로 포함되어 있다고 추론하는 것이 합리적입니다.

  3. "로컬 클래스 선언에 public, protected, private 또는 static 액세스 한정자 중 하나가 포함되어 있으면 컴파일 타임 오류입니다." 14.3 14.3 지역 클래스 선언

자바 내부 클래스 정의가 컴파일 타임 상수를 정적으로 선언 할 수 있고 Enum의 멤버가 분명히 컴파일 타임 상수이고 enum이 정적 클래스라고 말하고 있기 때문에 이상합니다.

문서 :

8.1.3 내부 클래스 및 엔 클로징 인스턴스

(...) 내부 클래스는 컴파일 타임 상수 필드가 아닌 한 정적 멤버를 선언 할 수 없습니다.

class Outer{
    class Inner extends HasStatic{
        static final int x = 3;         // ok - compile-time constant
        static int y = 4;           // compile-time error, an inner class
    }
    static class NestedButNotInner{
        static int z = 5;           // ok, not an inner class
    }
    interface NeverInner{}              // interfaces are never inner
}

http://mindprod.com/jgloss/enum.html gives a good description of java enums - as previously mentioned, enums are defined as static so they can't be declared as locals

ReferenceURL : https://stackoverflow.com/questions/700831/why-cant-enums-be-declared-locally-in-a-method

반응형