Java/EffectiveJava 썸네일형 리스트형 [EffectiveJava] 12장 직렬화 85. 자바 직렬화의 대안을 찾으라 // 85-1 역질렬화 폭탄 - 이 스트림의 역직렬화는 영원히 계속된다. static byte[] bomb() { Set root = new HashSetM(); Set s1 = root; Set s2 = new HashSet(); for (int i = 0; i < 100; i++) { Set t1 = new HashSet(); Set t2 = new HashSet(); t1.add("foo"); // t1을 t2와 다르게 만든다. s1.add(t1); s1.add(t2); s2.add(t1); s2.add(t2); s1 = t1; s2 = t2; } return serialize(root); // 간결하게 하기 위해 이 메서드의 코드는 생략함 } 86. Serial.. [EffectiveJava] 11장 동시성 78. 공유 중인 가변 데이터는 동기화해 사용하라 // 78-1 잘못된 코드 - 이 프로그램은 얼마나 오래 실행될까? private static boolean stopRequested; public static void main(String[] args) throws InterruptedException{ Thread backgroundThread = new Thread(() -> { int i = 0; while (!stopRequested) i++; }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } // 78-2 적절히 동기화해 스레드가 정상 종료한다. public class StopTread{ privat.. [EffectiveJava] 10장 예외 69. 예외는 진짜 예외 상황에만 사용하라 // 69-1 예외를 완전히 잘못 사용한 예 - 따라하지 말 것! try { int i = 0; while(true) { // 절대 좋지 않은 코드 range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e){ } // 표준적인 관용구로 하면 이해하기 쉽고 try는 필요하지 않다, for (Mountain m : range) { m.climb(); } for ( Iterator i = collection.iterator(); i.hashNext(); ) { Foo foo = i.next(); ... } // 컬렉션을 이런 식으로 순회하지 말 것! try { Iterator i = collection.iter.. [EffectiveJava] 9장 일반적인 프로그래밍 원칙 57. 지역변수의 범위를 최소화하라 // 57-1 컬렉션이나 배역을 순회하는 권장 관용구 for (Element e : c) { ... // e로 무언가를 한다 } // 57-2 반복자가 필요할 때의 관용구 for (Iterator i = c.iterator(); i.hasNext(); ) { Element e = i.next(); ... // e와 i로 무언가를 한다 } Iterator i = c.iterator(); while(i.hasNext()){ doSomething(i.next()); } ... Iterator i2 = c2.iterator(); while(i.hasNext()){//버그! doSomething(i2.next()); } for(Iterator i = c.iterator(); i.. [EffectiveJava] 8장 메서드 49. 매개변수가 유효한지 검사하라 /** * (현재 값 mod m) 값을 반환한다. 이 메서드는 * 항상 음이 아닌 BigInteger를 반환한다는 점에서 remainder 메서드와 다르다. * * @param m 계수(양수여야 한다.) * @return 현재 값 mod m * @throws ArithmeticException m이 0보다 작거나 같으면 발생한다. */ public BigInteger mod(BigInteger m) { if (m.signum() = 0 && offset = 0 && a.length - offset; ... // 계산 수행 } 50. 적시에 방어적 복사본을 만들라 // 50-1 기간을 표현하는 클래스 - 불변식을 지키지 못했다. public final class Peri.. [EffectiveJava] 7장 람다와 스트림 42. 익명 클래스보다는 람다를 사용하라 // 42-1 익명 클래스의 인스턴스를 함수 객체로 사용 - 낡은 기법이다! (254쪽) Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); public static void main(String[] args) { Item42 item = new Item42(); item.exam01(); } // 42-2 람다식을 함수 객체로 사용 - 익명 클래스 대체 (255쪽) Collections.sort(words, (s1,s2)-> Integer.compare(s1.le.. [EffectiveJava] 6장 열거 타입과 애너테이션 34. int 상수 대신 열거 타입을 사용하라 // 34-1 정수 열거 패턴 - 상당히 취약하다! public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; // 향긋한 오렌지 향의 사과 소스! int i = (APPLE_FUJI - ORANGE_TEMPLE) / APPLE_PIPPIN; // 34-2 가장 단.. [EffectiveJava] 5장 제네릭 26. 로 타입은 사용하지 말라 // 26-1 컬렉션의 로 타입 - 따라 하지 말 것! // Stamp 인스턴스만 취급한다. private final Collection stamp=...; // 실수로 동전을 넣는다. stamps.add(new Coin(...)); // "unchecked call" 경고를 내뱉는다. // 26-2 반복자의 로 타입 - 따라 하지 말 것! for (Iterator i = stamps.iterator(); i.hasNext();) { Stamp stamp = (Stamp) i.next(); //ClassCastException을 던진다. stamp.cancel(); } // 26-3 매개변수화된 컬렉션 타입 - 타입 안전성 확보! private final Collectio.. 이전 1 2 다음