2017-12-03 1 views
1

난 그냥 자바 시작했고 나는 코드의이 부분을 포함하는 GUI와 계산기를 만든 :계산기를 피하십시오? - 자바

private void Decider(char c){ 
    switch (c){ 
     case '+': 
      CalculatorGui.add.operate(); 
      break; 
     case '-': 
      CalculatorGui.sub.operate(); 
      break;` 
     case '*': 
      CalculatorGui.mul.operate(); 
      break; 
     case '/': 
      CalculatorGui.div.operate(); 
      break; 
     default: 
      System.out.printf("Invalid\n"); 
      break; 

    } 
} 

주어진 char c 의존하는 버튼 인터페이스에 사용자가 클릭을합니다. 그가 +를 클릭하면 우리는 -을 클릭하면 - 등을 얻습니다. 내가 작성한 4 가지 다른 클래스에서 필요한 메소드를 호출 할 때마다.

내 질문은 : switch 문을 피할 방법이 있습니까?

하나의 메서드로 하나의 클래스를 만들 수 있다고 가정하고, 우리가 통과 한 것에 따라 적절한 연산을 수행 할 것입니다. 하지만 그때 스위치 문을 만들어야 할 것입니다.

당신은 Runnable의지도를 준비 할 수
+2

:

Map<Character, Runnable> map = new HashMap<>(); map.put('+',() -> CalculatorGui.add.operate()); map.put('-',() -> CalculatorGui.sub.operate()); map.put('*',() -> CalculatorGui.mul.operate()); map.put('/',() -> CalculatorGui.div.operate()); 

을 그리고 대응 조치하거나 기본 작업을 수행하는 맵을 사용 스위치 사용하지 않겠습니까? 어쨌든 gui를 사용하는 경우 (특정 것으로 보이는 것처럼) 조작 버튼에 특정 수신기를 연결할 수 있습니다. 따라서 4 개의 다른 리스너를'+','-','*','/'버튼에 붙일 수 있으며, switch 문을 사용하지 않아도 그에 따라 호출됩니다. 문자를 사용하고 스위치를 켜기를 원한다면'+','-','*','/'를 키로 사용하여'Map'을 사용할 수도 있습니다. – BackSlash

답변

2

: 당신이 원하는 왜 특별한 이유가

map.getOrDefault(c,() -> System.out.println("Invalid")).run(); 
+0

왜 Runnable입니까? BiFunctions 인 이진 연산자 (https://docs.oracle.com/javase/8/docs/api/java/util/function/BiFunction.html –

+0

@DavidSoroko)가 아닌가? 붙인 코드에 정적 메서드 호출이 void로되어 있기 때문입니다. 그것은 아무런 논쟁도하지 않습니다. 게시 된 코드에 2 개의 매개 변수를 사용하여 값을 반환하는 호출이 있으면 'BiFunction'이 적합합니다. OP가 자신의 코드를 완전히 재구성해야 할 수도 있지만, 그 밖의 다른 것을 보지 못했습니다. 추측과 추측을 피하고 싶습니다. – janos

+0

맞습니다.하지만 추측을 피하는 것은 아닙니다. op 코드가 의미있는 유일한 방법은 실제 피연산자가 Decider가 포함 된 클래스의 인스턴스 변수 일 때라고 생각합니다. –

관련 문제