728x90
반응형

Effective Java 67

[Effective Java] 아이템 80. 스레드보다는 실행자, 태스크, 스트림을 애용하라.

🎯 아이템 80. 스레드보다는 실행자, 태스크, 스트림을 애용하라. java.util.concurrent 두둥등장 실행자 프레임워크라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있음 ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(runnable); exec.shutdown(); 🎯 아이템 81. wait와 notify보다는 동시성 유틸리티를 애용하라. wait와 notify는 올바르게 사용하기가 아주 까다로우니 고수준 동시성 유틸리티를 사용하자! java.util.concurrent의 고수준 유틸리티의 세 범주 1️⃣ 실행자 프레임워크 2️⃣ 동시성 컬렉션 3️⃣ 동기화 장치 1) 실행자 프레임워크는 앞에서..

Java 2023.04.15

[Effective Java] 아이템 79. 과도한 동기화는 피하라.

🎯 아이템 79. 과도한 동기화는 피하라. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안된다. 동기화된 영역을 포함한 클래스 관점에서는 이런 메서드는 모두 바깥 세상에서 온 외계인이므로 예측할 수 없는 이슈를 발생 시킨다 잘못된 코드. 동기화 블록 안에서 외계인 메서드를 호출한다. public class ObservableSet extends ForwardingSet { public ObservableSet(Set set) { super(set); } private final List observers = new ArrayList(); public void addObserver(SetObserver observer) { synchronize..

Java 2023.04.13

[Effective Java] 아이템 77. 예외를 무시하지 말라.

// catch 블록을 비워두면 예외가 무시된다. 아주 의심스러운 코드다! try{ ... } catch (SomeException e){ } 예외는 문제 상황에 잘 대처하기 위해 존재하는데 catch 블록을 비워두면 예외가 존재할 이유가 없어진다. 물론 예외를 무시해야 할 때도 있다. 예를 들어 FileInputStream을 닫을 때가 그렇다. 파일의 상태를 변경하지 않았으니 복구 할 것이 없으며, 필요한 정보는 이미 다 읽었다는 뜻이니 남은 작업을 중단할 이유도 없다. 어쨌든 예외를 무시하고 했다면 catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수의 이름도 ignored로 바꿔놓도록 하자. 참고 자료 Joshua Bloch, 『Effective Java 3/E』, 개앞맵시 옮김, ..

Java 2023.04.12

[Effective Java] 아이템 76. 가능한 한 실패 원자적으로 만들라.

🎯 아이템 76. 가능한 한 실패 원자적으로 만들라. 일반화해 이야기하면, 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 메서드를 실패 원자적으로 만드는 방법 1️⃣ 불변 객체 불변 객체의 상태는 생성 시점에 고정되어 절대 변하지 않기 때문이다. 클래스를 불변으로 만들기 위한 5가지 규칙 1.객체의 상태를 변경하는 메서드(setter)를 제공하지 않는다. 2.클래스를 확장할 수 없도록 한다. 3.모든 필드를 final로 선언한다. 4.모든 필드를 private으로 선언한다. 5.자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 2️⃣ 매개변수의 유효성 검사 객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성 대부분을 걸러낼 수 있는 방법이다. public ..

Java 2023.04.06

[Effective Java] 아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라.

🎯 아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라. @Override public Object invoke(Object target, Object... parameters) { try { return ( (Method) getMember() ).invoke( target, parameters ); } catch (NullPointerException e) { throw new IllegalArgumentException( "Invoking " + getName() + " on a null object", e ); } catch (IllegalArgumentException e) { throw new IllegalArgumentException( "Invoking " + getName() +..

Java 2023.04.05

[Effective Java] 아이템 74. 메서드가 던지는 모든 예외를 문서화하라.

🎯 아이템 74. 메서드가 던지는 모든 예외를 문서화하라. 메서드가 던지는 예외는 그 메서드를 올바로 사용하는 데 아주 중요한 정보다. 따라서 각 메서드가 던지는 예외 하나하나를 문서화하는 데 충분한 시간을 쏟아야 한다. 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화하자. /** * ... 생략 * * @throws SecurityException if a security manager exists and its * checkPermission method denies enabling * subclassing. * @throws IOException if an I/O error occurs while creating this stre..

Java 2023.04.04
728x90
반응형