본문 바로가기

공부/JAVA19

이펙티브 자바 2장 규칙 5. 불필요한 객체는 만들지 말라 Effective Java 2장 객체의 생성과 삭제 규칙 5. 불필요한 객체는 만들지 말라 기능적으로 동일한 객체는 필요 시마다 만드는 것보다는 재사용하는 것이 좋음. // 안좋은 예 String s = new String("stringette"); // 실행 시마다 String 객체를 만듬. // 개선 String s = "stringette"; 생성자나 정적팩터리 메서드(규칙1)를 함께 제공하는 클래스의 경우, 정적팩터리 메서드를 사용하면 불필요한 객체 생성을 피할 수 있다. (ex) 규칙1 의 Boolean.valueOf 의 예 변경가능한 객체도 재사용 가능. 단, 최초 한 번 초기화 되면 변경 불가능해야 함. final static 멤버변수 선언, 정적 초기화 블록 사용. public class .. 2021. 2. 17.
이펙티브자바 2장 규칙4. 객체생성을 막을 때는 private 생성자를 사용하라 Effective Java 2장 객체의 생성과 삭제 규칙 4. 객체생성을 막을 때는 private 생성자를 사용하라 정적메서드나 필드만 모은 클래스를 만드는 상황이 생길 수 있음. 유틸성 클래스들(static 필드나 메서드만을 가지고 있는) ex) java.util.Math 보통 아무런 인자가 없는 default 생성자가 기본적으로 만들어지기 때문에, 클래스를 abstract 으로 선언하는 것은 소용 없음. 따라서, 객체생성을 막고 싶다면 private 생성자를 클래스에 생성해 객체를 생성하는 것을 방지해야 함. private AClass(){ throw new AssertionError(); } 위와같이 private 생성자 안에 AssertionError를 예외처리 해줄 수 있음. 해당 방법을 사용하.. 2021. 2. 17.
이펙티브 자바 2장 규칙3. private 생성자나 enum 자료형은 싱글턴 패턴 따르도록 설계하라 규칙 3. private 생성자나 enum 자료형은 싱글턴 패턴 따르도록 설계하라 싱글턴 객체를 하나만 만들 수 있는 클래스 방법 1. static 멤버변수로 선언(생성자를 private으로) public class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis(){...} } 클래스가 싱글턴인지 선언만 보면 금방 알 수 있어 좋음. public static final 선언하였으므로 같은 객체 참조. JVM의 경우, 정적팩토리 메서드 호출을 inline으로 처리하므로 정적 팩터리 메서드 방법을 사용하는게 좋음. 방법 2. 정적 팩토리 메서드 이용(변수 선언은 private으로) public class Elvis{ privat.. 2021. 2. 2.
이펙티브 자바 2장 규칙2.생성자 인자가 많을 경우, Builder 패턴을 적용하라 규칙 2. 생성자 인자가 많을 경우, Builder 패턴 적용하라 생성자와 정적팩터리의 한계 선택적 인자가 많은 상황에 놓였을 때, 잘 적응하지 못함. (꼭 초기화 되지 않아도 되는 인자) 대안 1. 점층적 생성자 패턴 필수인자만 받는 생성자 정의, 선택적 인자를 추가 (예시) 영양분석표를 클래스로 나타낸 상황이며, servingSize, servings 만 필수인자 NutritionFacts.java public class NutritionFacts{ private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; public.. 2021. 2. 2.
이펙티브 자바 2장 규칙1. 생성자 대신 정적 팩터리 메서드를 사용하라 규칙 1. 생성자 대신 정적 팩터리 메서드를 사용하라 장점 생성자와 달리 정적팩터리 메서드의 경우, 이름을 정할 수 있음. (이해가 쉬움) 인자의 순서만 다른 생성자 두 개 존재 시, 이름이 동일하므로 API설명서를 읽지 않고는 이 두개를 구분하기 어려움. 정적 팩터리 메서드의 경우, 이름으로 의미를 표현 가능하므로 이런 문제가 발생하지 않음. (예시) 소수일 가능성이 높은 BigInteger객체를 생성하는 생성자인 BigInteger(int, int, Random) -> BigInteger.probablePrime 과 같은 이름의 정적 팩터리 메서드로 표현했다면 더 이해하기 쉬웠을 것. 생성자와 달리, 호출될 때 마다 새로운 객체를 생성하지 않아도 된다. 이미 만들어둔 객체 사용 / 객체 캐시(Cach.. 2021. 2. 2.
[Spring] Interceptor [Interceptor] 현재 하고 있는 프로젝트에서 로그인 시 권한체크를 Interceptor로 구현해주고 있는 상황이다. 기존 시스템에 새로운 프로그램을 도입하였고, 새로운 프로그램에서 만든 Interceptor가 기존 시스템에 영향을 끼쳐 권한이 없어 화면이 동작하지 않는 등 문제가 생겼다. 문제는 해결되었으나, 이에 대해 조금 더 깊이 이해하고, 추후 또 발생할 수 있는 문제점을 방지할 수 있으려면 코드를 어떻게 고쳐야 할지에 대해 이해하고 싶어 이를 공부하고 글을 남겨놓기로 하였다. 인터셉트. 용어의 의미처럼 중간에 가로챈다는 의미이다. 컨트롤러에 들어오는 HttpRequest와 HttpResponse를 가로채는 역할을 하며, 인증용도로 활용하는 등(위의 사례처럼, 권한체크) 의 기능을 구현할 .. 2020. 8. 8.