개발/Effective Java 66

[Effective Java] Item 6. 불필요한 객체 생성을 피하라

[Effective Java] Item 6. 불필요한 객체 생성을 피하라 예시 public class RomanNumerals { private static final Pattern ROMAN = Pattern.compile( "^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); static boolean isRomanNumeral (String s) { return ROMAN.matcher(s).matches(); } ) } 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 재사용은 빠르고 세련되어 특히 불변 객체는 언제든 재사용할 수 있다. 다음 코드는 하지 말아야할 극단적인 예시이다. String..

[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 예시 public class AccountService implements UserDetailsService { private final AccountRepository accountRepository; private final EmailService emailService; private final PasswordEncoder passwordEncoder; private final AppProperties appProperties; public AccountService(AccountRepository accountRepository, EmailService emailService, PasswordEnco..

[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 예시 public class UtilityClass { // 기본 생성자가 만들어지는 것을 막는다. (인스턴스화 방지용) private UtilityClass() { throw new AssertionError(); } ... (생략) }이따금 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이기에 그리 곱게 보이지는 않지만, 분명 나름의 쓰임새가 있다. 1) java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있다. 2) java.Util.Collecti..

[Effective Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증해라

[Effective Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증해라 예시 public class Elvis { private static final Elvis INSTANCE = new Elvis(); private Elvis() { } public static Elvis getInstance() { return INSTANCE; } public void leaveTheBuilding() { System.out.println("Whoa baby, I'm outta here!"); } // This code would normally appear outside the class! public static void main(String[] args) { Elvis e..

[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려해라

[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려해라 예시 NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) .calories(100).sodium(35).carbohydrate(27).build(); 정적 팩터리와 생성자에는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 식품 포장의 영양 정보를 표현하는 클래스에서 영양 정보는 1회 내용량, 총 2회 제공량, 1회 제공량당 칼로리 같은 필수 항목 몇 개와 총 지방, 트랜스지방, 포화지방, 콜레스테롤, 나트륨 등 총 20개가 넘는 선택 항목으로 이뤄진다. 그런데 대부분 제품은 이 선택 항목중 대다수의 값이 그냥 0이다. 이..

[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라

[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라 예시 public static Boolean valueOf(boolean b){ return b ? Boolean.True : Boolean.False; }클래스는 클라이언트에 public 생성자 대신 (혹은 생성자와 함께) 정적 팩터리 메서드를 제공할 수 있다. 이 방식에는 장점과 단점이 모두 존재한다. 정적 팩터리 메서드의 5가지 장점 이름을 가질 수 있다. (생성자 호출 방식) BigInteger(int, int Random) (정적 팩토리 메서드 호출 방식) BigInteger.probablePrime 위 예시에서 값이 소수인 BigInteger를 반환한다는 의미를 더 잘 설명할 수 있는 것은 정적 팩터리 메서..