분류 전체보기
-
Item 35: Use instance fields instead of ordinals독서/Effective Java 2022. 1. 8. 16:26
ordiinal 메서드 대신 인스턴스 필드를 사용하라 대부분의 열거 타입 상수는 자연스럽게 하나의 정숫값에 대응되며, 그 정숫값을 반환하기 위해 열거 타입에서는 해당 상수가 몇 번째인지를 반환하는 ordinal이라는 메서드를 제공한다. public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } } 중간에 하나씩 같은 수의 열거 타입 상수가 추가된다 해도, 이에 따른 정숫값 정리를 하는 것이 불가능하다. 그리고 중간에 수를 비워두는 행위 또한 불가능하다(순서를 반환하는 것이기 때문) 또한, 중..
-
Item 31: Use bounded wildcards to increase API flexibility독서/Effective Java 2022. 1. 7. 23:12
한정적 와일드카드를 사용해 API 유연성을 높이라 Parameterized Type은 불공변이다. Type1과 Type2가 있을 때 List은 List의 하위 타입, 상위 타입이 아니다. Ex) String은 Object의 하위 타입이지만, List은 List의 하위 타입이 아니다. List은 List가 하는 일을 제대로 수행하지 못하니 하위 타입이 될 수 없다(리스코프 치환 원칙에 어긋남. item 10) public class Stack { public Stack() {} public void push(E e){} public E pop(){} public boolean isEmpty(){} // 추가되는 pushAll public void pushAll(Iterable src){ for (E e: ..
-
Item 30: Favor generic methods독서/Effective Java 2022. 1. 2. 18:12
이왕이면 제네릭 메서드로 만들라 메서드도 제네릭으로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭이다. Collections의 알고리즘 메서드는 모두 제네릭이다. 다음은 Raw Type으로 작성된, 문제가 있는 코드다. public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } @Test void setTest(){ Set a = new HashSet(); Set b = new HashSet(); a.add("test"); b.add(1); Set c = CollectionUtil.union(a, b); log.info(c.toString())..
-
Item 29: Favor generic types독서/Effective Java 2022. 1. 2. 17:19
이왕이면 제네릭 타입으로 만들라 이번 아이템에서는 아이템 7에서 다뤘던 Stack Code를 Generic Type으로 변경한다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) throw new EmptyStackExc..
-
Item 28: Prefer lists to arrays독서/Effective Java 2022. 1. 2. 17:18
배열보다는 리스트를 사용하라 배열과 제네릭의 첫번째 차이: 공변, 불공변 Sub가 Super의 하위 타입이라고 가정할 경우 배열 공변(함께 변함)이기에 Sub[]은 Super[]의 하위 타입이다. 제네릭은 불공변이기에 List은 List의 하위 타입이 아니다. // 테스트를 위한 클래스들이니 Lombok의 Getter, Setter 사용 @Getter @Setter public class Parent { private int age; } public class Child extends Parent{} public class NotChild extends Parent{} @Test void runTimeTest(){ Parent[] array = new Child[1]; Assertions.assertTh..
-
Item 27: Eliminate unchecked warnings독서/Effective Java 2022. 1. 2. 15:22
비검사 경고를 제거하라 제네릭을 사용하기 시작하면 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등 수많은 컴파일러 경고를 보게 되고, 새로 작성하게 되는 코드들이 꼭 한번에 깨끗하게 컴파일될 것이라는 보장은 없다. 하지만, 대부분의 Unchecked warning은 쉽게 제거할 수 있다. 해결책은 다음과 같다. @Test void ListTest(){ // Intellij 자동 완성도 이렇게 만들어준다. List strings = new ArrayList(); } 할 수 있는 한 이러한 종류의 모든 비검사 경고를 제거하자. 모두 제거한다면 그 코드는 타입 안정성이 보장된다. 즉, 런타임에 ClassCastException이 발생하지 않고, 의도..
-
Item 26: Don’t use raw types독서/Effective Java 2021. 12. 28. 02:00
Generic 장에서 사용할 용어들 정리 한글 용어 영문 용어 예 아이템 매개변수화 타입 parameterized type List Item 26 실제 타입 매개변수 actual type parameter String Item 26 제네릭 타입 generic type List Item 26, 29 정규 타입 매개변수 formal type parameter E Item 26 비한정적 와일드카드 타입 unbounded wildcard type List Item 26 로 타입 raw type List Item 26 한정적 타입 매개변수 bounded type parameter Item 29 재귀적 타입 한정 recursive type bound Item 30 한정적 와일드카드 타입 bounded wildcar..
-
Item 25: Limit source files to a single top-level class독서/Effective Java 2021. 12. 26. 16:20
톱레벨 클래스는 한 파일에 하나만 담으라 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 컴파일은 잘 수행된다. 다음은 Utensil.java 클래스 코드이다. class Utensil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; } 실제 사용 시 main method는 컴파일, 실행이 문제 없이 된다. public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } } // result pancake 근데 같은 클래스들을 정의하는 Dessert.ja..