자바 최적화 코드 중 대량의 if/else,switch/case

3654 단어 Java
앞에서 말 했 듯 이 프로젝트 가 교체 되면 서 코드 에 존재 하 는 분기 판단 이 점점 많아 질 수 있 습 니 다.그 안에 관련 된 논리 가 비교적 복잡 하거나 분기 수량 이 너무 많아 서 유지 하기 어 려 울 때 우 리 는 이런 코드 를 더욱 우아 하 게 만 들 수 있 는 방법 이 있 는 지 고려 해 야 합 니 다.
본문
매 거 진 을 사용 하여 상 태 를 나타 내 는 매 거 진 을 간단하게 정의 합 니 다.
public enum Status {
    NEW(0),RUNNABLE(1),RUNNING(2),BLOCKED(3),DEAD(4);

    public int statusCode;

    Status(int statusCode){
        this.statusCode = statusCode;
    }
}

그럼 우리 가 사용 할 때 직접 매 거 진 호출 을 통 해 호출 할 수 있 습 니 다.
int statusCode = Status.valueOf("NEW").statusCode;

다음 코드 할당 방식 을 우아 하 게 해결 하 였 습 니 다.
if(param.equals("NEW")){
    statusCode = 0;
}else if(param.equals("RUNNABLE")){
    statusCode = 1;
}
...

Optional 을 잘 사용 하 는 것 은 프로젝트 에서 비 어 있 는 판단 이 빠 질 수 없 으 며 대부분 사람들 은 다음 과 같은 용법 일 수 있 습 니 다.
if(null == user){
    //action1
}else{
    //action2
}

이 럴 때 optional 이라는 비밀 무 기 를 꺼 내야 합 니 다.비 공 검사 가 더욱 우아 하고 간접 적 으로 if 작업 을 줄 일 수 있 습 니 다.Optional 을 알 지 못 한 학생 은 스스로 구 글 을 할 수 있 습 니 다.여 기 는 더 이상 군말 하지 않 습 니 다.
Optional userOptional = Optional.ofNullable(user);
userOptional.map(action1).orElse(action2);

위의 코드 는 첫 번 째 단락 과 같은 효 과 를 가지 고 새로운 특성 을 통 해 코드 를 더욱 치밀 하 게 한다.
표 구동 법 은 Google 의 설명 에서 나 온 것 입 니 다.표 구동 법 은 프로 그래 밍 모델 로 논리 문 구 를 대체 하기 위해 표 에서 정 보 를 조회 하 는 것 이 본질 입 니 다(if,case).다음은 한 사례 를 살 펴 보 겠 습 니 다.달 을 통 해 그 달의 일 수 를 얻 을 수 있 습 니 다.(사례 시연 으로 만 2 월 의 데 이 터 를 얻 을 수 있 습 니 다.엄밀 하지 않 습 니 다)일반적인 방법 은 다음 과 같 습 니 다.
int getMonthDays(int month){
	switch(month){
		case 1:return 31;break;
		case 2:return 29;break;
		case 3:return 31;break;
		case 4:return 30;break;
		case 5:return 31;break;
		case 6:return 30;break;
		case 7:return 31;break;
		case 8:return 31;break;
		case 9:return 30;break;
		case 10:return 31;break;
		case 11:return 30;break;
		case 12:return 31;break;
		default:return 0;
	}
}

표 구동 법 실현 방식
int monthDays[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int getMonthDays(int month){
	return monthDays[--month];
}

사실 이곳 의 시 계 는 배열 일 뿐 입 니 다.배열 을 직접 조회 하여 필요 한 데 이 터 를 얻 으 면 같은 이치 로 Map 같은 용기 도 우리 프로 그래 밍 개념 중의 표 가 될 수 있 습 니 다.
Map, Function> action> actionsMap = new HashMap<>();

//         
actionsMap.put(value1, (someParams) -> { doAction1(someParams)});
actionsMap.put(value2, (someParams) -> { doAction2(someParams)});
actionsMap.put(value3, (someParams) -> { doAction3(someParams)});
 
//    null   
actionsMap.get(param).apply(someParams);

자바 8 의 lambda 표현 식 을 통 해 실행 할 것 을 value 에 저장 하고 호출 할 때 key 와 일치 하 는 방식 으로 진행 합 니 다.
미리 판단 하여 다음 문장 으로 되 돌려 줍 니 다.

if(condition){
   //dost
}else{
   return ;
}

...로 바꾸다
if(!condition){
   return ;
}
//dost

불필요 한 가 지 를 피하 고 코드 를 더욱 세련 시 킵 니 다.
다른 방법 은 위 에서 언급 한 방법 을 제외 하고 우 리 는 일부 디자인 모델,예 를 들 어 전략 모델,책임 체인 모델 등 을 통 해 대량의 if,case 가 존재 하 는 상황 을 최적화 시 킬 수 있다.그 원 리 는 표 구동 모델 과 비슷 할 것 이다.예 를 들 어 우리 가 Netty 의 사용 과정 에서서로 다른 명령 을 대량으로 판단 하여 대응 동작 을 수행 해 야 하 는 장면 이 나타 날 수 있다.
ServerHandler.java

if(command.equals("login")){
    //    
}else if(command.equals("chat")){
    //  
}else if(command.equals("broadcast")){
    //    
}
....

 
결 어 는 마지막 으로 명확 하 게 해 야 한다.모든 if/else 가 아니 라 switch/case 가 최적화 되 어야 한다.우리 가'통 증'이 있다 는 것 을 발견 하면 다시 최적화 하 는 것 이 가장 좋다.그렇지 않 으 면 확장 되 지 않 는 확장 가능 한 코드 를 쓸 수 있다.모든 최 적 화 는 더 좋 은 교체 프로젝트 를 위 한 것 이지 업무 에 더 좋 은 서 비 스 를 위 한 것 이지 최 적 화 를 위 한 것 이 아니다.

좋은 웹페이지 즐겨찾기