Reference/Effective-Java

    [Effective-Java] Chapter7 #42. 익명 클래스보다는 람다를 사용하라

    💡 익명 클래스는 (함수형 인터페이스가 아닌) 타입의 인스턴스를 만들 때만 사용하라 📌 As-is. 익명 클래스가 세상을 지배하던 시기 예전에는 자바에서 함수 타입 표현을 위해 추상 메서드를 하나만 담은 인터페이스 또는 드물게 추상 클래스를 사용했다. 이러한 인터페이스를 함수 객체(function object)라 하며, 특정 함수나 동작을 나타내는데 사용 JDK 1.1이 등장하면서 함수 객체를 만드는 주요 수단은 익명 클래스(Item24)였다. public class Main { public static void main(String[] args) { List words = Arrays.asList("Hello", "World", "Java", "Lambda", "Stream"); // 람다식을 사용하지..

    [Effective-Java] Chapter6 #41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

    💡 적용 대상이 ElementType.Type인 마커 애너테이션을 작성하고 있다면, 마커 인터페이스와 비교해보라 📌 마커 인터페이스 vs 마커 어노테이션 interface MarkerInterface { // 아무런 메서드가 없음 } public class MyClass implements MarkerInterface { // 표식을 나타내기 위해 MarkerInterface를 구현 } 아무런 메서드나 상수를 가지지 않는 인터페이스 클래스가 해당 인터페이스를 구현하는 것으로 표식을 나타냄 주로 인터페이스 구현을 통해 특정 동작이나 기능 활성화 용도로 사용됨 ex. Serializerable 인터페이스를 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 쓸(write) 수 있다고, 즉 직..

    [Effective-Java] Chapter6 #40. @Override 애너테이션을 일관되게 사용하라

    💡 재정의한 모든 메서드에 @Override 애너테이션을 의식적으로 달면, 실수했을 때 컴파일러가 알려줄 것이다. 📌 As-is. @Override를 달지 않았을 때 public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + second; } public s..

    [Effective-Java] Chapter6 #39. 명명 패턴보다 애너테이션을 사용하라

    💡 자바 프로그래머라면 예외 없이 자바가 제공하는 애너테이션 타입들은 사용해야 한다. 애너테이션으로 할 수 있는 일을 명명 패턴으로 처리할 이유는 없다. 📌 명명 패턴의 단점 ✒️ 명명 패턴 : 메서드 이름을 특정 문자열로 시작하게 만들어, 해당 문자열이 들어가면 실행하도록 하는 패턴 오타가 나면 안 된다. JUnit3가 무시하고 지나쳐서 테스트가 통과되었다고 오해할 수 있다. 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다. 클래스 이름에 Test를 붙여도 JUnit3은 관심도 없으므로, 개발자가 의도한 테스트는 수행되지 않는다. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다. 특정 예외를 던져야 성공하는 테스트에서, 예외 타입을 테스트에 매개변수로 전달해야 하는 상황 가정 예외 이름을..