-
JEP 513 Flexible Constructor BodiesJava/Java25 2025. 12. 20. 13:14
생성자(Constructor)의 본문(body)에서 super(...) 또는 this(...) 호출 전에 임의의 안전한 코드; 를 작성할 수 있도록 허용하는 기능입니다.
생성자에서 인자 검증, 정제(trim), 계산, 필드 선 초기화를 superclass 호출보다 앞서 작성 가능 합니다.기존 Java는 생성자에서 다른 생성자(super/this) 호출이 첫 번째 문장이어야 했다(필수!)는 제약이 있었지만, JEP 513은 이 제약을 완화합니다.
첫 문장은 반드시 super() 규칙을 깨고, 실질적으로 안전한 범위 내에서 자유도(유연성)가 부여 되었습니다.
Code Example
// 변경 전 public class Sub extends Super { public Sub(int x) { super(x); // 반드시 첫 번째여야 함 // 그 이후에 코드 } } // 변경 후 public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { // validation check 를 super 앞(pre-construction context)로 추가 가능 if (value <= 0) { throw new IllegalArgumentException("non-positive value"); } super(Long.toString(value)); } }하지만, pre-construction context 에서는 객체가 완전히 초기화 되지 않았기 때문에
→ this, 인스턴스 필드 참조, 인스턴스 메서드 호출은 금지됩니다
public class X { private int value; X() { this.value++; // ❌ 'this' 접근 불가 System.out.println(value); // ❌ 인스턴스 접근 super(); } }Code Example 2 ; Enum
대소문자 변경 후 생성자 호출 가능
public enum Currency { USD("usd"), KRW(" krw "), EUR("Eur"); private final String code; // 보조 생성자 Currency(String rawCode) { // 1. JEP 513 덕분에 this() 호출 전 로직 수행 가능 if (rawCode == null || rawCode.isBlank()) { throw new IllegalArgumentException("코드 입력 필수"); } String cleanedCode = rawCode.trim().toUpperCase(); // 2. 가공된 데이터를 가지고 메인 생성자 호출 this(cleanedCode); } // 메인 생성자 Currency(String code) { this.code = code; } }History
버전 JEP 번호 주요 변경 사항 Final (JDK 25) JEP 513 정식 기능 확정. 구문 변경 및 안전성 보장 https://openjdk.org/jeps/513 3rd Preview (JDK 24) JEP 492 세 번째 프리뷰. 변경 사항 없음, 추가 피드백 수집 https://openjdk.org/jeps/492 2nd Preview (JDK 23) JEP 482 두 번째 프리뷰. Early Construction Context 개념 명확화 https://openjdk.org/jeps/482 1st Preview (JDK 22) JEP 447 첫 번째 프리뷰. "Unnamed Classes and Instance Main Methods"에서 다른 제목으로 제안 https://openjdk.org/jeps/447 'Java > Java25' 카테고리의 다른 글
JEP 511: Module Import Declarations (0) 2025.12.27 Java 25 Performance Improvement (0) 2025.12.21 JEP 512 Compact Source File & Instance Main Method (0) 2025.12.20 JEP 506 Scoped Values (0) 2025.12.16 Java 22 신규 및 변경 기능 (0) 2025.12.14