Clean Code that Works.

1. 인자의 유효성을 검사하라

2. 필요한 경우 방어복사를 하라

3. 메소드 시그니처를 신중하게 설계하라

4.메소드를 중복정의할 때는 신중하라

5. Null이 아닌 길이가 0인 배열을 리턴하라

6. 외부에서 제공하는 API의 모든 구성요소에 대해 문서화 주석을 달아라

1. 구조체는 클래스로 바꿔라

2. union은 클래스 계층 구조로 바꿔라

3. enum 구문은 클래스로 바꿔라

4. 함수 포인터를 클래스와 인터페이스로 바꿔라

출처. effective java

1. 클래스와 멤버에 대한 접근은 최소화하라

2. 불변 클래스를 써라

3. 상속보다 컴포지션을 써라

4. 상속받을 수 있도록 설계화하고 문서화하라, 아니면 상속을 금지하라

5. 추상클래스보다는 인터페이스를 써라

6. 인터페이스는 타입을 정의할 때만 써라

7. 중첩 클래스는 정적 멤버 클래스로 정의하라

출처. effective java

1. 클래스와 멤버에 대한 접근은 최소화하라

2. 불변 클래스를 써라

3. 상속보다 컴포지션을 써라

4. 상속받을 수 있도록 설계화하고 문서화하라, 아니면 상속을 금지하라

5. 추상클래스보다는 인터페이스를 써라

6. 인터페이스는 타입을 정의할 때만 써라

7. 중첩 클래스는 정적 멤버 클래스로 정의하라

출처. effective java

1. equals 메소드를 재정의할 때 표준 구현계약을 지켜라

2. equals 메소드를 재정의하면 hashCode 메소드도 반드시 재정의하라

3. toString 메소드는 항상 재정의하는 것이 좋다.

4. clone메소드는 신중하게 재정의 하라.

5. Comparable 인터페이스의 구현을 고려하라.


출처. effective java

1. 생성자 대신 스태틱 팩토리 메소드를 고려하라.
 
2. private 생성자를 써서 싱클톤을 유지하라.

3. private 생성자로 인스턴스를 만들지 못하게 하라.

4. 쓸데없는 객체를 중복 생성하지 마라.

5. 쓸모 없는 객체 참조는 제거하라.

6. 종료자들을 쓰지 마라.

출처. effective java

먼저 교환권을 가져가세요

문맥 : 쓰레드(Client)가다른 쓰레드에 처리를 의뢰하고 있어 Client는 처리의 실행 결과도 얻고 싶다고 합시다.

문제 : 처리를 의뢰한 때에 실행 결과를 기다리고 있어 응답성이 저하되어 버리고 맙니다.

해결법
  우선 처리 결과와 같은 인터페이스(API)를 가진 Future를 만듭시다. 그리고 처리 개시의 시점에서 Future를 반환값으로 합니다. 처리 결과는 나중에 Future에 set합니다. 이렇게 하면 Client는Future를 경유해서 처리 결과를 좋아하는 타이밍으로 얻는(기다리는)것이 가능합니다. 이것이 Future 패턴입니다.

관련
  Client가 처리 결과를 기다리는 부분에서는 Guarded Suspention 패턴을 사용합니다.
  Future 패턴은 Thread-Per-Message 패턴으로 처리 결과를 얻고 싶을 때 사용합니다.
  Future 패턴은 Worker Thread 패턴으로 처리 결과를 얻고 싶을 때에 사용합니다.


- 자바로 배우는 디자인 패턴 입문 -

일이 올 때까지 기다리고 일이 오면 일한다.

별명 : Thread Pool, Background Thread

문맥 : 쓰레드(Client)가 인스턴스(Host)의 메소드를 호출하고 있다고 합시다.

문제
  메소드의 처리에 시간이 걸리면 응답성이 낮아지게 됩니다. 응답성을 높이기 위해서 새로운 쓰레드를 기동해서 메소드를 처리시키면 쓰레드 기동의 시간만큼 스루풋은 저하됩니다. 또 다수의 리퀘스트를 내면 다수의 쓰레드가 기동하게 되어 버려서 용량을 저하시킵니다.

해결법
  우선 처리를 실행하는 쓰레드(워커 쓰레드)를 사전에 기동해 둡시다. 그리고 리퀘스트를 표현하는 인스턴스를 워커 쓰레드에 건네는 것입니다. 그렇게 하면 새로운 쓰레드를 매회 기동할 필요가 없게 됩니다.

관련
  워커 쓰레드의 처리 결과를 호출하는 측에 건내줄 때에는 Future 패턴을 사용합니다.
  리퀘스트를 표현하는 인스턴스를 워커 쓰레드에 건내줄 떼에는 Producer-Consumer 패턴을 사용합니다.

- 자바로 배우는 디자인 패턴 입문 -

이 일은 해두어야 해요

문맥 : 쓰레드(Client)가 인스턴스(Host)의 메소드를 호출하고 있다고 합시다.

문제 : 메소드의 처리가 끝나기까지 Host에서 제어가 되돌아오지 않습니다. 메소드의 처리에 시간이 걸리면 응답성이 저하됩니다.

해결법
  Host 중에 새로운 쓰레드를 기동합시다. 그리고 메소드가 해야 할 실제의 처리는 이 새로운 쓰레드에 맡기는 것입니다. 이것으로 Clinet 쓰레드는 곧장 다음의 처리로 넘어 갈 수 있습니다. 이렇게 되면 Client 코드는 그대로 있고 응답성을 높일 수 있습니다.

구현
  자바에서는 손쉽게 쓰레드를 기동하기 위해서 익명 내부 클래스를 이용할 수 있습니다.
  new Thread() {
     public void run() {
       helper.handle(count, c);
     }
  }.start();

관련
  쓰레드의 기동에 걸리는 시간을 줄이고 싶을 때에는 Work Thread 패턴을 사용합니다.
  처리의 결과를 Client에 되돌리고 싶을 때에는 Future 패턴을 사용합니다.

- Java언어로 배우는 디자인 패턴 입문 -

없애려고 해도 없어지지 않아

문맥 : 복수의 쓰레드가 인스턴스를 공유하고 있지만 인스턴스의 상태가 변화하는 것은 아닙니다.

문제 : Single Threaded Execution 패턴을 사용하면 스루풋이 떨어져버립니다.

해결법
  인스턴스가 만들어진 후 상태가 변화하는 것이 아니라면 Single Threaded Execution 패턴을 사용하는 것은 그만둡시다. 실수로 상태가 변화하는 코드를 쓰지 않도록 하기 위해 쓰레드가 필드를 변경하지 못하도록 합니다. 또 인스턴스의 상태를 변경하는 메소드(setter)가 있으면 소거합니다. 인스턴스의 상태를 알아보는 메소드(getter)는 있어도 상관없습니다.
  이것이 Immutable 패턴입니다. Immutable 패턴을 사용하면 스루풋은 향상됩니다. 그러나 불변성(immutability)을 계속 보유하는 것은 곤란합니다. 문서에 그 클래스가 immutable인 것을 확실히 알아둡시다.

구현
  자바에서는 필드를 은폐하기 위해 private를 사용합니다. 또한 변경할 수 없도록 하기 위해 final을 사용합니다.

관련
  복수의 쓰레드를 배타 제어할 때에는 Single Threaded Execution 패턴을 사용합니다.
  변경하는 쓰레드가 참조하는 쓰레드의 수보다 적을 때에는 Read-Write Lock 패턴을 사용 합니다.

- Java언어로 배우는 디자인 패턴 입문 -