<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
{font-family:Helvetica;
panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Aptos",sans-serif;}
span.EmailStyle20
{mso-style-type:personal-reply;
font-family:"Aptos",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hi Remi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Good point! I get it that the value of this is not accessible in lambda body before the superconstructor call.<o:p></o:p></p>
<p class="MsoNormal">However, we cannot access the value of this in the early construction context even without lambda:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black">class Test {</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> int a;</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> Test() {</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> this.a = 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> int a = this.a; // compilation error</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> super();</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> }</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black">}</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="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?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal">Ella<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="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"><o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
<div class="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="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<o:p></o:p></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="MsoNormal"><span style="color:black">Hi,<o:p></o:p></span></p>
<p class="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:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black">class Test {</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> int a;</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> Test() {</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> this.a = 1;</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> super();</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black"> }</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black">}</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">This compiles just fine (I have JDK 23 build 25).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">However, when I try to do the same in a lambda body, I get a compilation error:<o:p></o:p></span></p>
<p class="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"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black">Test.java:9:27</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:black">java: cannot reference this before supertype constructor has been called</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Is lambda body some special case? <o:p>
</o:p></span></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="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.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></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="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Thank you,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Ella Ananeva<o:p></o:p></span></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:black">regards,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:black">Rémi<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>