柔軟なコンストラクタ本体
super()またはthis()を呼び出す前に値の検証や計算を行う。
コード比較
✕ Java 8
class Square extends Shape {
Square(double side) {
super(side, side);
// can't validate BEFORE super!
if (side <= 0)
throw new IAE("bad");
}
}
✓ Java 25+
class Square extends Shape {
Square(double side) {
if (side <= 0)
throw new IAE("bad");
super(side, side);
}
}
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
フェイルファスト
スーパークラスのコンストラクタが実行される前に引数を検証できます。
先に計算
super()を呼び出す前に値を導出してデータを準備できます。
回避策不要
制限を回避するための静的ヘルパーメソッドやファクトリパターンが不要になります。
旧来のアプローチ
super()の後でバリデーション
モダンなアプローチ
super()の前にコードを記述
JDKバージョン
25
難易度
中級
JDKサポート
柔軟なコンストラクタ本体
利用可能
JDK 25 LTSでファイナライズ(JEP 513、2025年9月)
仕組み
Java 25はsuper()が最初の文でなければならないという制限を解除します。親コンストラクタに処理を委譲する前に、引数の検証、派生値の計算、状態のセットアップが可能になります。
関連ドキュメント