2016-06-03 2 views
1

나는 다음과 같은 몸이 클래스의 성적이 다른이 경우-방지하는 방법 :이 시나리오에서 문

public class Grades { 

    public static Grade getGrades(int marks) { 
     if (marks < 10) { 
      return Grade.FAILED; 
     } else if (marks < 13) { 
      return Grade.DISTINCTION; 
     } else if (marks < 15) { 
      return Grade.GREAT; 
     } else { 
      return Grade.GREATEST; 
     } 
    } 

    public static void main(String args[]){ 
     System.out.println(getGrades(6)); 
    } 
} 

그리고 열거 클래스 : 나는 다른 경우를

public enum Grade { 

    FAILED("F"), 
    DISTINCTION("D"), 
    GREAT("G"), 
    GREATEST("G"); 


    private String code; 

    Grade(String code){ 
     this.code = code; 
    } 

    public String getCode() { 
     return code; 
    } 

} 

을 피할 수있는 방법 getGrades(int marks)에 전화 할 때의 건설은?

+4

을 왜 그것을 피하기를 원합니까? 좋아 보인다. –

+2

'등급'(예 :'FAILED ("F", Integer.MIN_VALUE, 9), DISTINCTION ("D", 10, 12)'등의 ctor에 추가 매개 변수로 범위를 전달한 다음' Grade.values ​​()를 사용하여 값이 포함 된 학년 범위의 인스턴스를 찾습니다. –

+1

두 가지 답변이 내부적으로 사용됩니다.이 작업을 수행하려면 if/else가 필요합니다. 어떤 접근 방식도 현재의'getGrades' 메소드보다 낫다. –

답변

6

여기에 대한 의사 결정 테이블을 구현할 것입니다. Predicate (입력을 받아서 true 또는 false을 반환하는 함수)과 Predicatetrue으로 평가되는 경우 해당 결과 사이의 매핑 일뿐입니다.

Java8은 Predicate<T> 인터페이스를 도입 했으므로 매우 유용 할 수 있습니다. 또한 람다 (lambda)로 표현 될 수있어 코드의 자세한 정보를 줄일 수 있습니다.

그래서 당신은 할 것 :

Map<Predicate<Integer>, Grade> table = new LinkedHashMap<Predicate<Integer>, Grade>() {{ 
     put (x -> x < 10, Grade.FAILED); 
     put (x -> x < 13, Grade.DISTINCTION); 
     put (x -> x < 15, Grade.GREAT); 
}}; 

을 그리고, 바로 의사 결정 테이블을 반복하고 찾을 때까지 Predicate의 평가에 같은 true로 평가 사용자들은 당신에게 답변을 제공해야합니다 :

for (Entry<Predicate<Integer>, Grade> entry : table.entrySet()) { 
    if (entry.getKey().test(marks)) { 
     return entry.getValue(); 
    } 
} 
return Grade.GREATEST; 
관련 문제