2017-09-12 1 views
0

나는 제대로 열거를 반복하기 위해 당신은 내가 평일과 주말 내 열거 일에 static 배열을 생성열거 형 생성자에서 생성 된 모든 열거 형 값의 배열에서 마지막 열거 형이 null입니까?

for (Days day : Days.values() {}

해야한다고 알고있다. 생성자에서 = new Days[] {SAT, SUN}을 수행하여 적절한 Days 값을 채 웁니다. 이것들을 반복 할 때 의도 한대로 작동합니다.

그러나 Days의 모든 값에 대해 내 자신의 정적 배열을 만들 때 잃어 버렸습니다. 이전과 완전히 똑같은 방식으로 추가했습니다. 이 배열을 반복하면 내 주변 요소의 마지막 요소는 null입니다. Days enum에서 테스트 할 허구의 날을 추가하기 시작한 곳에서 얼마나 많은 요소가 있더라도 결과는 같습니다. "해결책"은 그것을 만드는 것이었다 final. 그러나 내가 잘못하고있는 것을 이해하고 싶습니다.

이것은 열거 생성자의 배열을 초기화하는 것이 나쁘다고합니다. 주중/주말 배열이 비슷한 점이 있습니까? 이게 실제로 큰 노 - 노입니까? enum 생성자에서 수행해야하는 다른 작업은 무엇입니까? 아니면 더 정확하게 사용해야합니까? 이 같은 일을 제외하고

enum Days { 
    MON("Monday"); 

    String fullname; 

    private Days(String n) {fullname = n}; 
} 

다른 사람이 설명 할 수있는 문서를 가리킬 수 있습니까? java enums 및/또는 해당 생성자에 대한 일부 선장의 명백한 정보가 부족할 수 있습니다.

대답을 검색하는 과정에서 나는 static {}을 발견했습니다. 이것은 열거 형에서 정적 배열 초기화의 측면에서 좋은 방법일까요? 다른 대안이 있습니까?

편집 : 정확한 코드가 필요합니다.

public enum Days { 
    MON, TUE, WED, THU, FRI, SAT, SUN; 

    public static Days[] weekdays; 
    public static Days[] weekend; 
    public static Days[] all; 

    Days() { 
    weekdays = new Days[] {MON, TUE, WED, THU, FRI}; 
    weekend = new Days[] {SAT, SUN}; 
    all = new Days[] {MON, TUE, WED, THU, FRI, SAT, SUN}; 
    } 
} 

String s = "" 
for (Days d : Days.all) { 
    s += d.toString(); //d is null once it reaches the last item 
} 
+4

코드를 설명하지 마십시오. 그것을 게시하십시오. 당신이받는 오류를 설명하거나 바꾸지 마십시오. 그들을 게시하십시오. –

+0

배열이 초기화 된 코드를 공유 할 수 있습니까? –

+0

문제의 원인이되는 코드를 게시 할 수 있습니까? (질문에서 일부 텍스트를 제거 할 수 있습니까? –

답변

4

시도 :

public enum Days { 
    MON, TUE, WED, THU, FRI, SAT, SUN; 

    public static Days[] weekdays = {MON, TUE, WED, THU, FRI}; 
    public static Days[] weekend = {SAT, SUN}; 
    public static Days[] all = {MON, TUE, WED, THU, FRI, SAT, SUN}; 
} 

귀하의 코드 내 이클립스 IDE에서 컴파일되지 않았다. 코드가해야 할 노력은 무엇이다 :

  • 7 개 인스턴스 MON, TUE, WED, THU, FRI, SAT, SUN (즉, 첫 번째 줄의)와 함께 열거를 정의합니다.
  • Days 인스턴스가 생성되면 3 개의 정적 배열에 특정 내용 (생성자가하는 것)을 채 웁니다. 여기에 문제가 있습니다! 예를 들면.첫 번째 열거 형 인스턴스 (MON)가되고 다른 인스턴스도 수명주기를 시작하지 않았으며 MON도 아직 준비되지 않았습니다 (아직 그 이름으로는 사용할 수 없습니다). 따라서 배열에는 정의되지 않은/비어있는 내용이 있습니다.
  • enum에 7 개의 값이 포함되어 있으므로 한 번 더 인스턴스를 사용할 수있게 될 때마다 배열 초기화를 7 번 수행합니다. 마지막 인스턴스는 SUN의 인스턴스입니다. 그런 다음 6 개의 다른 인스턴스가 준비되면 일곱 번째 배열을 덮어 씁니다. 이번에 만 SUN이 누락되어서 마지막 항목을 여전히 null로 가져 왔습니다.

그래서이 바로 그 enum 자체의 생성자에서 enum 값을 참조하지 마십시오.

그런데 컴파일 타임 오류를 표시하지 않은 컴파일러는 무엇을 사용하고 있었습니까?

+1

안드로이드에서 AIDE IDE를 사용하고 있습니다. 안드로이드 SDK이기 때문에 자바 표준을 따르지 않습니다. 나는 구체적인 것을 모른다. 그러나 마지막 항목이 null 인 이유에 대한 설명이 중요하므로이 항목의 질문에 대한 대답으로 받아들입니다. 필자가 제안한 몇 가지 옵션 중에서도 배열을 올바르게 초기화하는 방법에 대한 조언을 듣고 싶습니다. 감사. – Raith

+0

필자가 대답 한 코드는 완벽하게 작동합니다 (최소한 데스크톱 Java에서는). –

+0

그것은 실제로 나에게도 효과가있다. 그것이 최선의 관행 (또는 그 중 하나)이라면, 그것은해야 할 것입니다. – Raith

0

내가보기에, 당신은 화상을 입습니다. JLS 8.9.2. 열거 값이 themselves static 때문에

It is a compile-time error to reference a static field of an enum type that is not a constant variable (§4.12.4) from constructors, instance initializer blocks, or instance variable initializer expressions of that type.

, 당신의 코드는 위반이다. 당신이 당신이 나중에 참조 할 수 있도록, 당신의 주말 열거 번에 대한 정보를 캐시하기 위해 게터를 설정 할 수있는

이 비효율적으로 보일 수도 있지만,.

public Days[] getWeekend() { 
    if(null == weekend) { 
     weekend = new Days[]{MON, TUE}; 
    } 
    return weekend; 
} 

독자의 연습 문제로 동시성 문제를 처리해야합니다.

+0

그래도 컴파일 시간 오류가 발생 했습니까? 그것은 잘 컴파일, 런타임에 충돌합니다. 일부 코드를 추가했습니다. 이것이 여전히 원인일까요? – Raith

+0

@Raith : 실행중인 Java 버전은 무엇입니까? IntelliJ가있는 Java 8은 오류 : (11, 42) 이니셜 라이저에서 정적 필드에 대한 잘못된 참조를 사용하여 이것을 컴파일하지 않습니다. – Makoto

+0

안드로이드 용 IDE IDE를 사용하고 있습니다. 자바 버전이 무엇인지 명시하지 않은 것은 재미 있습니다. 나는 찾고있다. 그러나 그것은 7과 동등해야한다. 그것이 실제로 안드로이드 SDK이기 때문에 나는 동등한 말을한다. 그것보다 구체적인 것은 말할 수 없습니다. 하지만 당신 말이 맞아, 이클립스와 자바 7로 내 바탕 화면에 컴파일되지 않습니다. 나쁘지. – Raith