<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Mar 12, 2018 at 10:48 AM, Brian Goetz <span dir="ltr"><<a href="mailto:brian.goetz@oracle.com" target="_blank">brian.goetz@oracle.com</a>></span> wrote:</div><div class="gmail_quote"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Historically, this() or super() must be first in a constructor. This restriction was never popular, and perceived as arbitrary.<br></blockquote><div><br></div><div>It is <i>very very occasionally</i> annoying. Do we have enough motivation to change it? Are they any circumstances today in which I have to worry that `this` might be unassigned, or would that be new? If I reviewed the code above, I would move the `super` to the top anyway. It's how we've always done it and there's nothing at all wrong with it, since it's an exception case. What are the more motivating examples? (OTOH, this is just a tangent to the main thread.)</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If we put our implicit construction at the beginning, this would be a dead assignment to the parameter, after the record was initialized, which is almost certainly not what the user meant.  If we put it at the end, this would pick up the update.  The former seems pretty error-prone, so the latter seems attractive.<br></blockquote><div><br></div><div>You've reminded me that this is how we make defensive copies, which I would call critically important for records, so yes.</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">However, this runs into another issue, which is: what if we have additional fields?  (We might disallow this, but we might not.)</blockquote><div><br></div><div>Let's go to Crazy Town for a second... (and I mean it, this could be insane)</div><div><br></div><div>Today, field initializers and instance initializers certainly don't have any constructor parameters in scope, because they apply to <i>all</i> constructors. But for records we've discussed mandating that all constructors must funnel through the primary one (which I think is good). That means there is really only one true constructor. Is it insane to say that initializers, then, only apply to that primary constructor, and ergo we allow that constructor's parameters to be referenced in initializers?</div><div><br></div><div>Consequence 1: you could do</div><div><br></div><div><font face="monospace, monospace"> public record B(int a, int b) {</font></div><div><font face="monospace, monospace">   int cachedSum = a + b;</font></div><div><font face="monospace, monospace"> }</font></div><div><br></div><div>Consequence 2: maybe the precondition example doesn't have to be</div><div><br></div><div><font face="monospace, monospace"> public record B(int a, int b) {</font></div><div><font face="monospace, monospace">   public B {</font></div><div><font face="monospace, monospace">     if (b < 0) throw...</font></div><div><font face="monospace, monospace">   }</font></div><div><font face="monospace, monospace"> }</font></div><div><br></div><div>but simply</div><div><br></div><div><div style="color:rgb(34,34,34);font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace"> public record B(int a, int b) {</font></div><div style="color:rgb(34,34,34);font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace">   {</font></div><div style="color:rgb(34,34,34);font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace">     if (b < 0) throw...</font></div><div style="color:rgb(34,34,34);font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace">   }</font></div><div style="color:rgb(34,34,34);font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><font face="monospace, monospace"> }</font></div><br class="gmail-Apple-interchange-newline">(again, imho, "the right amount of repetition is no repetition")</div><div><br></div><div>I like this outcome, but I would imagine that when we pull on the thread of everything else that follows from a decision like this we probably won't end up liking it...</div><div><br></div><div><br></div></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div style="line-height:1.5em;padding-top:10px;margin-top:10px;color:rgb(85,85,85);font-family:sans-serif"><span style="border-width:2px 0px 0px;border-style:solid;border-color:rgb(213,15,37);padding-top:2px;margin-top:2px">Kevin Bourrillion |</span><span style="border-width:2px 0px 0px;border-style:solid;border-color:rgb(51,105,232);padding-top:2px;margin-top:2px"> Java Librarian |</span><span style="border-width:2px 0px 0px;border-style:solid;border-color:rgb(0,153,57);padding-top:2px;margin-top:2px"> Google, Inc. |</span><span style="border-width:2px 0px 0px;border-style:solid;border-color:rgb(238,178,17);padding-top:2px;margin-top:2px"> <a href="mailto:kevinb@google.com" target="_blank">kevinb@google.com</a></span></div></div></div></div></div></div></div>
</div></div>