개요

예외라는 개념은 오류 코드를 연쇄적으로 전파하던 코드를 제거할 있게 해줬다.

예외는 과용하면 좋지 않다. 말그대로 예외인 경우에만 쓰여야 한다.

함수 호출 전에 문제를 제거할 있다면 그렇게 해야 한다.

예시

DB 연결 같은 자원을 관리하는 자원 클래스

풀은 어떤 자원이 할당되고 가용할 있는 지를 추적, 자원 바닥나면 새로 생성

 



import java.util.Deque;
import java.util.List;
import java.util.NoSuchElementException;
public class Refactoring1 {
    static class Resource{
        public static Resource create() {
            return null;
        }
    }
    static class ResourcePool{
        private Deque<Resource> available;
        private List<Resource> allocated;
       
        public Resource get() {
            Resource result;
            try {
                result = available.pop();
                allocated.add(result);
            }catch (NoSuchElementException e) {
                result = Resource.create();
                allocated.add(result);
            }
            return result;
        }
    }
}


import java.util.Deque;
import java.util.List;
import java.util.NoSuchElementException;
public class Refactoring1 {
    static class Resource{
        public static Resource create() {
            return null;
        }
    }
    static class ResourcePool{
        private Deque<Resource> available;
        private List<Resource> allocated;
       
        public Resource get() {
            Resource result;
            //풀에서 자원이 고갈되는 건 예상치 못한 조건이 아니다. 따라서 예외처리로 대응하는 건 옳지 않다.
            if(available.isEmpty()) {
                result = Resource.create();
                allocated.add(result);
            }else {
                try {
                    result = available.pop();
                    allocated.add(result);
                }catch (NoSuchElementException e) {
                    throw new AssertionError("도달 불가");
                }
            }
            return result;
        }
    }
}
예외에 도달하지 못한다면 이제 제거
import java.util.Deque;
import java.util.List;
public class Refactoring1 {
    static class Resource{
        public static Resource create() {
            return null;
        }
    }
    static class ResourcePool{
        private Deque<Resource> available;
        private List<Resource> allocated;
       
        public Resource get() {
            Resource result;
            if(available.isEmpty()) {
                result = Resource.create();
                allocated.add(result);
            }else {
                result = available.pop();
                allocated.add(result);
            }
            return result;
        }
    }
}


import java.util.Deque;
import java.util.List;
public class Refactoring1 {
    static class Resource{
        public static Resource create() {
            return null;
        }
    }
    static class ResourcePool{
        private Deque<Resource> available;
        private List<Resource> allocated;
       
        public Resource get() {
            //더 다듬기
            Resource result = available.isEmpty()? Resource.create():available.pop();
            allocated.add(result);
            return result;
        }
    }
}

 

 

+ Recent posts