자바 최적화 코드 중 대량의 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 가 최적화 되 어야 한다.우리 가'통 증'이 있다 는 것 을 발견 하면 다시 최적화 하 는 것 이 가장 좋다.그렇지 않 으 면 확장 되 지 않 는 확장 가능 한 코드 를 쓸 수 있다.모든 최 적 화 는 더 좋 은 교체 프로젝트 를 위 한 것 이지 업무 에 더 좋 은 서 비 스 를 위 한 것 이지 최 적 화 를 위 한 것 이 아니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.