메소드 몸체가 실행되기 전에 매개 변수를 확인하면 잘못된 값이 넘어왔을때 즉각적이로 깔끔한 방식으로 예외를 던질수 있다.
java7 에서 추가된 java.util.requireNonNull 메소드는 유연하고 사용하기 편하므로 null을 수동으로 검사 안해도 된다.
public class Board {
private final Bar bar;
public Board(Bar bar){
Object.requireNonNull(bar, "bar는 필수 값입니다.");
this.bar = bar
}
}
메소드나 생성자를 작성할 때면 그 매개변수들에 어떤 제약이 있을지 생각해야 한다. 그 제약들을 문서화 하고 메소드 코드 시작 부분에서 명시적으로 검사해야한다.
메소드의 이름을 신중하게 지어라
편의 메소드를 너무 많이 만들지 마라
너무 많은 세소드는 그에 따른 문서화, 유지보수, 테스트를 해야한다.
메소드의 매개변수 목록도 4개 이하가 적절하며 특히 같은 타입의 매개 변수가 연달아 나오는것은 좋지 않다.
과하게 긴 메개변수 목록을 짧게 줄여주는 기술
여러 메소드로 쪼갠다.
-> List에서의 subList / indexOf 등
List<Integer> numberList = List.of(1,2,3,4);
List<Integer> newNumberList = list.subList(0,2); // 순서 (value값 아님)
int index = newNumberList.indexOf(2) // value
도우미 클래스 이용 (helper class)
// 기존 메서드
public void someMethod(String name, String address, String email, String job) {
// do something
}
// Helper 클래스 적용
class SomeHelper {
String name;
String address;
String email;
String job;
}
public void someMethod(SomeHelper someHelper) {
// do something
}
참조 : https://madplay.github.io/post/effectivejava-chapter8-methods
빌더 패턴 이용 (아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하자)
매개변수의 타입으로는 클래스 보다는 인터페이스가 더 낫다.
-> ex) HashMap 보다는 Map을 사용하는 것이 좋다.
boolean 보다는 원소 2개짜리 열거 타입이 낫다. (메소드 이름상 boolean을 받아야 의미가 더 명확할때는 제외한다.)
다중정의 (overloading)은 어느 메소드를 호출할지 컴파일 타임에서 결정이 된다. 재정의(overriding)한 메소드는 동적으로 선택되고 다중정의한 메소드는 정적으로 선택 된다.
일반적으로 매개변수 수가 같을 때는 다중정의를 피하는 것이 좋다.
상황에 따라 특히 생성자라면 이 조언을 따르지 못할 것이다. 그러면 햇갈릴만한 매개변수는 형변환하여 정확한 다중정의 메소드가 선택되도록 해야 한다.
이것이 불가능 하다면 (ex) 기존 클래스를 수정해 새로운 인터페이스를 구성해야 할때는 같은 객체를 입력받는 다중정의 메소드를이 모두 동일하게 동작하도록 만들어야 한다.
인수 개수가 일치하지 않은 메소드를 정의해야 한다면 가변인수가 반드시 필요하다.
메소드를 정의 할 때 필수 매개변수는 가변인수 앞에 두고, 가변인수를 사용할때에는 성능 문제 까지 고려해야 한다.(배열을 새로 할당하고 초기화되기 떄문)
null을 반환하는 메소드는 null을 방어하는 코드를 반드시 추가해주어야 한다.
값을 반환하지 못할 가능성이 있고, 호출할 떄마다 반환값이 없을 가능성을 염두에 둬야 하는 메소드라면 Optional을 반환해야 할 상황일 수 있다.
하지만 Optional 반환에는 성능 저하가 뒤따르니, 성능에 민감한 메소드라면 null을 반환하거나 예외를 던지는 편이 나을수도 있다.
[참조] JAVA 8 (3) Stream / Optional의 등장
API를 올바르게 문서화하려면 공개된 모든 클래스,인터페이스,메소드,필드선언에 문서화 주석을 다는것이 좋다.
메소드용 문서화 주석에는 해당 메소드와 클라이언트 사이의 규약을 명료하게 기술한다.
열거 타입을 문서화할 때는 상수들에도 주석을 달아야 한다.
어노테이션 타입을 문서화할 때는 멤버들에도 모두 주석을 달아야 한다.
클래스 혹은 정적 메소드가 쓰레드 안전하든 아니든, 쓰레드 안전 수준을 반드시 API 설명에 포함해야 한다.