2012-09-03 3 views
5

내 프로젝트의 경우 많은 개체가 10 개의 클래스로 분할되었습니다. 각 오브젝트는 사전에 등록해야하는 몇 가지 조작을 수행 할 수 있습니다 (조작 등록은 클래스 당 한 번만 수행됨). 각 클래스에 대해 정의 된 작업은 public final static 정수로 표시됩니다. 런타임에 연산 ID를 동적으로 할당하고 싶습니다 (클래스 당 연산 수는 현재 약 20이고 숫자가 증가합니다).문 전환 및 정적 블록의 최종 정적 변수 초기화

작업이 수행 될 때 문제가 발생하고 어떤 작업이 수행되고 있는지 찾아야합니다 (switch 문 사용).

public class Test { 
    final static int foo = 8; 
    final static int bar = 10; 

    public static void main(String[] args) 
    { 
     int x=10; 

     switch(x) 
     { 
     case foo: 
      System.out.println("FOO"); 
      break; 
     case bar: 
      System.out.println("BAR"); 
      break; 
     default: 
      System.out.println("PROBLEM"); 
     } 
    } 
} 

이 코드가 정상적으로 컴파일 및 디스플레이 BAR :

여기에 작업 코드의 간단한 예입니다.

그러나이 약간 변형 된 코드는 Unresolved compilation problem이고 case expressions must be constant expressions입니다.

public class Test { 
    final static int foo; 
    final static int bar; 

    static 
    { 
     foo=8; 
     bar=10; 
    } 
    public static void main(String[] args) 
    { 
     int x=10; 

     switch(x) 
     { 
     case foo: 
      System.out.println("FOO"); 
      break; 
     case bar: 
      System.out.println("BAR"); 
      break; 
     default: 
      System.out.println("PROBLEM"); 
     } 
    } 
} 

이러한 코드가 실제로 작동하고 컴파일되지 않아야합니까? 이 문제를 해결하기 전에는 아무 것도 동적으로 수행 할 수 없습니까? 아니면 다른 방법이 있습니까? 우리는이 열거 형이 내가 스위치 (휘젓고 일 개 처리 기능을 가지고 싶습니다

public class Test { 
    enum OperationSet1 { 
    FOO, BAR, THESE, ARE, ALL, DIFFERENT, OPERATIONS 
    } 
    enum OperationSet2 { 
    FOO, BAR, NOW, SOME, OTHER, OPS 
    } 

    public static void main(String[] args) { 
    OperationSet1[] ops = new OperationSet1[10]; 
    for (int i=0; i<ops.length; i++) 
     ops[i] = OperationSet1.values()[(int)(Math.random()*OperationSet1.values().length)]; 

    OperationSet2[] ops2 = new OperationSet2[10]; 
    for (int i=0; i<ops.length; i++) 
     ops[i] = OperationSet2.values()[(int)(Math.random()*OperationSet2.values().length)]; 

    for (OperationSet1 op:ops) 
     handleOperation(op); 
    } 
    for (OperationSet2 op:ops2) 
     handleOperation(op); 
    } 
    public static void handleOperation(Object? op) { 
    switch(op) { 
     /**code to handle**/ 
    } 
    } 
} 

: 때문에 나는이 문제를 해결하고자하는 열거 형을 사용하는 아이디어 :

감사

편집 문),이 두 enums에 apperaing 모든 경우를 처리합니다.

EDIT2 : 여기 있습니다. 나는이 클래스들의 약 40 개의 객체들과 (C1, C2, ..., C10) 클래스를 가지고있다. 이러한 개체 중 일부는 소위 소유자이며 일부는 공유됩니다. 각 공유 객체에는 소유자가 있습니다 (기본 관계 - java 상속과 아무 관계가 없습니다). 이제

공유 객체 때때로 obj 변경이 obj 요구의 각이 변경 될 경우 (이것은 단지 작업 중 하나입니다) 다음은 변경 소유자 own에게 (다시 소유자 통지)하는 . 객체 obj에는 수행 할 수있는 미리 정의 된 작업 집합이 있으며 C1enum으로 정의됩니다. 따라서 own에는 C1 클래스의 오브젝트 조작에 대한 처리 함수가 있어야합니다. 이제 우리는 C2 클래스의 객체 obj2을 가지고 있고 다른 작업 집합과 동일한 소유자 own을 가지고 있습니다. objC1에 정의 된 작업 만 수행하고 obj2C2에 정의 된 작업 만 수행 할 수 있습니다.

처리 기능을 일반화하여 깔끔하게 작성하는 방법은 무엇입니까? 열거 형을 사용해야합니까?

+2

직교의 질문 : 당신의 int가 아닌 열거를 사용하는 이유가 무엇입니까? –

+0

아니요 이유는 없습니다 (제 생각 엔). 나는 정말 경험 많은 프로그래머가 아니므로 열거 형으로 구현하는 방법을 알지 못합니다. 나는 각각의 클래스가 public enum을 가질 것이라고 생각한다. 그렇다면 10 개 이상의 enum (각 클래스에 하나씩) 이상의 switch 문을 작성하는 방법은 무엇입니까? – Nejc

+0

저는 열거 형을 좋은 생각으로 생각하지 않습니다. 특히 데이터베이스를 다루는 경우 특히 그렇습니다. –

답변

4

컴파일 타임에 알려진 상수는 switch 문에서만 사용할 수 있습니다. 이것은 스위치 코드가 검사되고 정적으로 빌드되기 때문입니다.

는 두 번째 경우에 당신은

static 
{ 
    foo=8; 
    bar=foo; 
} 

을 할 수 있지만,이 값은 런타임 때까지 알 수없는 한, 중 스위치 문을 내장하거나 정확한지 확인 할 수있는 방법이 없을 것이다.

+0

switch 문과 관련된 문제점을 알고 있습니다. 하지만 내가 게시 한 두 코드의 차이점을 이해하지 못합니까? 컴파일러가 같은 방식으로 처리하면 안됩니까? 값은 실제로 알려집니다 ... 언제이 '정적'코드가 실행됩니까? – Nejc

+1

모든 코드는 런타임에만 실행되므로 컴파일러는 실행될 내용을 모릅니다. –

2

static variables or blocks or methods은 클래스 초기화 (런타임)시로드됩니다.

문제는 클래스를로드/초기화하기 훨씬 전에 컴파일하는 시간입니다. 그래서 필드는 final이며 intialized되지 않습니다 (컴파일 타임에).

첫 번째 경우에는 컴파일시에 foobar의 값을 알 수 있습니다.

0

나는 enum을 사용하는 것이 좋습니다. 이렇게하면 ID 처리가 더 이상 필요하지 않습니다.

public class Test { 
    enum Operation { 
    FOO, BAR, THESE, ARE, ALL, DIFFERENT, OPERATIONS 
    } 

    public static void main(String[] args) { 
    Operation[] ops = new Operation[10]; 
    for (int i=0; i<ops.length; i++) 
     ops[i] = Operation.values()[(int)(Math.random()*Operation.values().length)]; 

    for (Operation op:ops) 
     handleOperation(op); 
    } 

    public static void handleOperation(Operation op) { 
    switch(op) { 
    case FOO: 
     System.out.println("FOO"); 
     break; 
    case BAR: 
     System.out.println("BAR"); 
     break; 
    case THESE: 
     System.out.println("THESE"); 
     break; 
    case ARE: 
     System.out.println("ARE"); 
     break; 
    case ALL: 
     System.out.println("ALL"); 
     break; 
    case DIFFERENT: 
     System.out.println("DIFFERENT"); 
     break; 
    case OPERATIONS: 
     System.out.println("OPERATIONS"); 
     break; 
    default: 
     System.out.println("PROBLEM"); 
    } 
    } 
} 
+0

예 1 : 1 기준으로 이것을 이해합니다 ... 그래서 하나의 enum과 하나의 함수 (switch 문)를 처리합니다. 그러나 1에서 n까지의 관계 (많은 enum과 하나의 switch 문을 다루는)가있는 경우는 무엇입니까? int 타입의 값을 하나만 전달하기 때문에 int가 더 쉽습니다. (더 많은 enum을 사용하면 많은 타입의 문제를 해결할 수 있습니다.) 그런 다음 일반적인 타입 (Object)의 인수를 받아 들여야 만합니다. 어떤 종류의 instanceof 기반 switch 문을 수행합니까? – Nejc

+0

예제에 코드를 추가했습니다. 이제는 (이 경우에는 임의의) 연산 배열을 가지며 switch 문에서이 모든 연산을 처리합니다. – brimborium

+0

업데이트 된 질문보기 – Nejc

0

또는 단순히 사용 경우-ELSEIF 경우 :

private final static int ONE = 1; 
private final static int TWO = 2; 

public static void main(String[] args) { 
int value = 1; 

    if(value==ONE){ 

    } 
    else if(value==TWO){ 

    } 

}

관련 문제