ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JEP 513 Flexible Constructor Bodies
    Java/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

    댓글

Designed by Tistory.