<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Hi Ella,</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
What do you mean by "Why should the rules for a lambda be different"? Lambda bodies are not part of the early-construction context, as the lambda can be invoked anywhere and anytime after it's created, including before the super constructor call completes (such
 as when it's passed as a parameter to super constructor).</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Best,</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Chen</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> amber-dev <amber-dev-retn@openjdk.org> on behalf of Ella Ananeva <ella.ananeva@oracle.com><br>
<b>Sent:</b> Wednesday, June 5, 2024 3:30 PM<br>
<b>To:</b> Remi Forax <forax@univ-mlv.fr>; amber-dev <amber-dev@openjdk.org><br>
<b>Subject:</b> Re: [External] : Re: This expression in lambda in early construction context</font>
<div> </div>
</div>
<style>
<!--
@font-face
        {font-family:Helvetica}
@font-face
        {font-family:"Cambria Math"}
@font-face
        {font-family:Aptos}
p.x_MsoNormal, li.x_MsoNormal, div.x_MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Aptos",sans-serif}
span.x_EmailStyle20
        {font-family:"Aptos",sans-serif;
        color:windowtext}
.x_MsoChpDefault
        {font-size:10.0pt}
@page WordSection1
        {margin:1.0in 1.0in 1.0in 1.0in}
div.x_WordSection1
        {}
-->
</style>
<div lang="EN-US" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<div class="x_WordSection1">
<p class="x_MsoNormal">Hi Remi,</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Good point! I get it that the value of this is not accessible in lambda body before the superconstructor call.</p>
<p class="x_MsoNormal">However, we cannot access the value of this in the early construction context even without lambda:</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">class Test {</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">    int a;</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">    Test() {</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">        this.a = 1;</span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">        int a = this.a; // compilation error</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">        super();</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">    }</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">}</span><span style="color:black"></span></p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">JEP 482 specifically says that in the early construction context the value of this is not accessible, that we only can assigned the value to the fields of this class. Why should the rules for a lambda be different? I’d say, if we want
 a special behavior for lambda, it should be described in the specification, shouldn’t it?</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Thanks,</p>
<p class="x_MsoNormal">Ella</p>
<p class="x_MsoNormal"> </p>
<div id="x_mail-editor-reference-message-container">
<div>
<div style="border:none; border-top:solid #B5C4DF 1.0pt; padding:3.0pt 0in 0in 0in">
<p class="x_MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">Remi Forax <forax@univ-mlv.fr><br>
<b>Date: </b>Wednesday, June 5, 2024 at 12:33</span><span style="font-family:"Arial",sans-serif; color:black"> </span><span style="color:black">PM<br>
<b>To: </b>Ella Ananeva <ella.ananeva@oracle.com><br>
<b>Cc: </b>amber-dev <amber-dev@openjdk.org><br>
<b>Subject: </b>[External] : Re: This expression in lambda in early construction context</span><span style="font-size:12.0pt; color:black"></span></p>
</div>
<div>
<div>
<p class="x_MsoNormal"><span style="font-family:"Arial",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="font-family:"Arial",sans-serif; color:black"> </span></p>
</div>
<div class="x_MsoNormal" align="center" style="text-align:center"><span style="font-family:"Arial",sans-serif; color:black">
<hr size="0" width="100%" align="center">
</span></div>
<div>
<blockquote style="border:none; border-left:solid #1010FF 1.5pt; padding:0in 0in 0in 4.0pt; margin-left:3.75pt; margin-top:5.0pt; margin-bottom:5.0pt">
<p class="x_MsoNormal"><b><span style="font-family:Helvetica; color:black">From: </span>
</b><span style="font-family:Helvetica; color:black">"Ella Ananeva" <ella.ananeva@oracle.com><br>
<b>To: </b>"amber-dev" <amber-dev@openjdk.org><br>
<b>Sent: </b>Wednesday, June 5, 2024 8:45:57 PM<br>
<b>Subject: </b>This expression in lambda in early construction context</span></p>
</blockquote>
</div>
<div>
<blockquote style="border:none; border-left:solid #1010FF 1.5pt; padding:0in 0in 0in 4.0pt; margin-left:3.75pt; margin-top:5.0pt; margin-bottom:5.0pt">
<div>
<p class="x_MsoNormal"><span style="color:black">Hi,</span></p>
<p class="x_MsoNormal"><span style="color:black">I understand that JEP 482 allows to refer to
</span><span style="font-family:"Courier New"; color:black">this</span><span style="color:black"> in the early construction context if this expression is in the left part of an assignment expression:</span></p>
<p class="x_MsoNormal"><span style="color:black"> </span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">class Test {</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">    int a;</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">    Test() {</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">        this.a = 1;</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">        super();</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">    }</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">}</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="color:black">This compiles just fine (I have JDK 23 build 25).</span></p>
<p class="x_MsoNormal"><span style="color:black">However, when I try to do the same in a lambda body, I get a compilation error:</span></p>
<p class="x_MsoNormal" style="background:white"><span style="font-size:10.0pt; font-family:"Courier New"; color:#0033B3">interface
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:black">Foo
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">{<br>
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#0033B3">void
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#00627A">foo</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">();<br>
}<br>
<br>
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#0033B3">class
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:black">Test
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">{<br>
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#0033B3">int
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#871094">a</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">;<br>
<br>
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#00627A">Test</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">() {<br>
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:black">Foo lmb
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">= () -> {
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#0033B3">this</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">.a =
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#1750EB">1</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">;};<br>
</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#0033B3">super</span><span style="font-size:10.0pt; font-family:"Courier New"; color:#080808">();<br>
    }<br>
}</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">Test.java:9:27</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="font-family:"Courier New"; color:black">java: cannot reference this before supertype constructor has been called</span><span style="color:black"></span></p>
<p class="x_MsoNormal"><span style="color:black">Is lambda body some special case?
</span></p>
</div>
</blockquote>
<div>
<p class="x_MsoNormal"><span style="font-size:12.0pt; font-family:"Arial",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="font-size:12.0pt; font-family:"Arial",sans-serif; color:black">The lambda capture "this" (it is a parameter of the call to the construction of the lambda), but "this" as a value is only available after the call to the super
 constructor.</span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="font-size:12.0pt; font-family:"Arial",sans-serif; color:black"> </span></p>
</div>
<blockquote style="border:none; border-left:solid #1010FF 1.5pt; padding:0in 0in 0in 4.0pt; margin-left:3.75pt; margin-top:5.0pt; margin-bottom:5.0pt">
<div>
<p class="x_MsoNormal"><span style="color:black"> </span></p>
<p class="x_MsoNormal"><span style="color:black">Thank you,</span></p>
<p class="x_MsoNormal"><span style="color:black">Ella Ananeva</span></p>
</div>
</blockquote>
<div>
<p class="x_MsoNormal"><span style="font-size:12.0pt; font-family:"Arial",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="font-size:12.0pt; font-family:"Arial",sans-serif; color:black">regards,</span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="font-size:12.0pt; font-family:"Arial",sans-serif; color:black">Rémi</span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="font-size:12.0pt; font-family:"Arial",sans-serif; color:black"> </span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>