2008-09-26 7 views
25

에 열거 매개 변수는 말할 수 :자바 : 내가하는 방법이 방법

private static String drawCellValue(
    int maxCellLength, String cellValue, String align) { } 

을 당신이 알 수 있듯이, 나는 정렬라는 매개 변수가 있습니다. 이 메서드 안에는 값이 '왼쪽'인지 '오른쪽'인지에 대한 if 조건이 있습니다. 매개 변수를 String으로 설정하면 분명히 모든 문자열 값을 전달할 수 있습니다. 가능하면 알고 싶습니다. 메서드 매개 변수로 Enum 값을 가지며, 그렇다면 어떻게됩니까?

누군가가 이것에 대해 생각한다면; 나는 부울 값을 사용하는 것에 대해 생각했지만 실제로 그렇게 생각하지는 않습니다. 첫째, true/false를 왼쪽/오른쪽과 연관시키는 방법은 무엇입니까? (좋아, 나는 주석을 사용할 수 있지만 여전히 더러운 것을 알 수있다.) 둘째, 'justify'와 같은 새로운 값을 추가하기로 결정할 수있다. 따라서 2 가지 이상의 값을 가질 수 있다면, Boolean 타입은 확실히 사용할 수 없다.

아이디어가 있으십니까?

+4

+1 부엉이 및 댓글을 사용하고 싶지 않으신 분께 - 감사합니다. – wchargin

답변

56

이 그것을 수행해야합니다

private enum Alignment { LEFT, RIGHT };  
String drawCellValue (int maxCellLength, String cellValue, Alignment align){ 
    if (align == Alignment.LEFT) 
    { 
    //Process it... 
    } 
} 
1

물론, 당신은 열거를 사용할 수 있습니다. 다음과 같은 일이있을 것입니까?

enum Alignment { 
    LEFT, 
    RIGHT 
} 

개인 정적 문자열 drawCellValue (INT의 maxCellLength, 문자열 cellValue, 정렬 정렬) {}

당신은 부울을 사용하고자하는 경우, 당신은 alignLeft 같은으로 정렬 매개 변수의 이름을 바꿀 수 있습니다. 나는이 구현이 깨끗하지 않다는 데 동의하지만 많은 변경을 예상하지 않고 공개 인터페이스가 아닌 경우 좋은 선택 일 수 있습니다.

1

또한 SwingConstants. {LEFT, RIGHT}을 (를) 다시 사용할 수 있습니다. 그들은 열거 형이 아니지만 이미 존재하며 여러 곳에서 사용됩니다.

19

당신이 스위치를 사용할 수있는 열거 형과 심지어 쿨러 : 예외의 출력이 열거 값의 이름이 아닌 어떤 임의의 int 값되기 때문에

switch (align) { 
    case LEFT: { 
     // do stuff 
     break; 
    } 
    case RIGHT: { 
     // do stuff 
     break; 
    } 
    default: { //added TOP_RIGHT but forgot about it? 
     throw new IllegalArgumentException("Can't yet handle " + align); 

    } 
} 

열거 형이 시원합니다.

4

나는 이것을 훨씬 좋아한다. if/switch를 줄이면됩니다. 물론

private enum Alignment { LEFT, RIGHT; 

void process() { 
//Process it... 
} 
};  
String drawCellValue (int maxCellLength, String cellValue, Alignment align){ 
    align.process(); 
} 

, 이 될 수 있습니다

String process(...) { 
//Process it... 
} 
+4

+1 아이디어는 바른 길에 있습니다. 그러나 프로세스 메소드는 추상적이어야하며 LEFT 및 RIGHT는 각각 구현을 제공해야합니다. –

+1

@ ChrisJester-Young 그 유사성에 따라 다릅니다. 그들이 매우 비슷하다면, 가능한 값은 구현의 일부분을 수행하는 private 메소드만을 제공 할 것이고,'process()'는 주 작업을 수행하고 필요하다면 이것을 호출한다. – glglgl

+0

@glglgl 맞습니다. 나는'if (this == LEFT)'와 같은 코드를보고 싶지 않습니다. 그게 전부입니다. :-) –

1

내가 가서 전체 깃털 클래스와 열거 형을 사용하는 것이 너무 확실하지 않다 -이 객체 지향 언어, 그리고 하나 객체 지향의 가장 기본적인 교리는 클래스가 한 가지 일을 잘 수행해야한다는 것입니다.

열거 형은 열거 형에서 꽤 잘 작동하고 있으며, 클래스는 클래스처럼 훌륭한 작업을 수행하고 있습니다. 두 가지를 섞어 보면 문제가 생길 수 있습니다. 예를 들어 열거 형 인스턴스를 만들 수 없기 때문에 열거 형 인스턴스를 매개 변수로 메서드에 전달할 수 없습니다.

그럼에도 불구하고 enum.process()를 수행 할 수 있다고해도 반드시해야한다는 것은 아닙니다.

public enum Alignment { LEFT, RIGHT } 
private static String drawCellValue(
int maxCellLength, String cellValue, Alignment align) {} 

다음 스위치 나 실제로 뭔가를 할 수있는 문 매개 변수 말했다 경우 하나를 사용할 수 있습니다

1

당신은 열거에서 사용할 수는 다음과 같이 매개 변수 말했다.

switch(align) { 
case LEFT: //something 
case RIGHT: //something 
default: //something 
} 

if(align == Alignment.RIGHT) { /*code*/} 
관련 문제