대량의 if - else 가 나타 날 때 어떻게 최적화 합 니까?

3676 단어 디자인 모드
우리 코드 에 서 는 다음 과 같은 상황 이 자주 발생 합 니 다.
String input = "three";

    @Test
    public void testElse() {
        if ("one".equals(input)) {
            System.out.println("one");
        } else if ("two".equals(input)) {
            System.out.println("two");
        } else if ("three".equals(input)) {
            System.out.println("three");
        } else if ("four".equals(input)) {
            System.out.println("four");
        }
    }

이러한 대량의 if - else 는 아름 답지 도 않 고 코드 유지 도 어렵 기 때문에 다음 에 이런 코드 를 최적화 시 키 고 대체적으로 최적화 하 는 방법 은 몇 가지 가 있 습 니 다!
우선 Spring 과 Guava 의존 도 를 도입 합 니 다.
1. Spring 결합 전략 모드
Spring 은 같은 인터페이스의 클래스 를 list 에 주입 할 수 있 습 니 다.
/***
 *     。type       Handler  
 * */
public interface Handler {
    String getType();

    void execute();
}
  /**
     *  Handler          List
     * */
    @Autowired
    private List handlerList;
    @Test
    public void testAutowireList(){
    //                  
         for(Handler handler:handlerList){
             if(input.equals(handler.getType())){
                 handler.execute();
             }
         }
    }

2. 반사
반사 동 태 를 통 해 상응하는 방법 을 호출 하 다
/***
 *            
*/
public class ReflectTest {
    public void methodOne() {
        System.out.println("one");
    }

    public void methodTwo() {
        System.out.println("two");
    }

    public void methodThree() {
        System.out.println("three");
    }

    public void methodFour() {
        System.out.println("four");
    }

}

 /***
     *
     *     ,      。   Guava    。
     * */
    @Test
    public void testReflect() throws Exception {
        //     ,        
        String methodName = "method" + LOWER_CAMEL.to(UPPER_CAMEL, input);
        Method method = ReflectTest.class.getDeclaredMethod(methodName);
        Invokable invokable =
                (Invokable) Invokable.from(method);
        invokable.invoke(new ReflectTest());
    }

3. lambda 표현 식

    @Test
    public void testJava8() {
        Map> functionMap = Maps.newHashMap();
        functionMap.put("one", ReflectTest::methodOne);
        functionMap.put("two", ReflectTest::methodTwo);
        functionMap.put("three", ReflectTest::methodThree);
        functionMap.put("four", ReflectTest::methodThree);
        functionMap.get(input).accept(new ReflectTest());
    }

4. 매 거
매 거 에서 추상 적 인 방법 을 정의 하고 각 유형 은 각자 의 구체 적 인 실현 에 대응 해 야 한다.
/**
 *      ,       
 */
public enum EnumTest {


    ONE("one") {
        @Override
        public void apply() {
            System.out.println("one");
        }
    },
    TWO("two") {
        @Override
        public void apply() {
            System.out.println("two");
        }
    }, THREE("three") {
        @Override
        public void apply() {
            System.out.println("three");
        }
    }, FOUR("four") {
        @Override
        public void apply() {
            System.out.println("four");
        }
    };

    public abstract void apply();

    private String type;

    EnumTest(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

}
  //     
 @Test
    public void testEnum() {
        EnumTest.valueOf(input.toUpperCase()).apply();
    }

좋은 웹페이지 즐겨찾기