<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div>This reads harsher than I intended, due to me efforts to be brief. So let me elaborate a little:</div><div><br class=""><blockquote type="cite" class=""><div class="">On Mar 28, 2018, at 5:47 PM, Dan Smith <<a href="mailto:daniel.smith@oracle.com" class="">daniel.smith@oracle.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><blockquote type="cite" class=""><div class="">On Mar 20, 2018, at 8:15 AM, Brian Goetz <<a href="mailto:brian.goetz@oracle.com" class="">brian.goetz@oracle.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" class="">
  
  <div text="#000000" bgcolor="#FFFFFF" class=""><blockquote type="cite" cite="mid:CAGKkBku7YMp2JRBBixSz_WAnSVxoV9XhMdy1Nrw2ngotst5FaA@mail.gmail.com" class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""><br class="">
            </div>
            <div class="">So add all this up and we have <i class="">three</i> kind of
              finalness for fields:</div>
            <div class=""><br class="">
            </div>
            <div class="">- by default mutable, but you can change it</div>
            <div class="">- by default final, and you can't change it</div>
            <div class="">- (and now) by default final, but you can change it</div>
            <div class=""><br class="">
            </div>
            <div class="">This seems like quite a bad situation to me.</div>
            <br class="">
          </div>
        </div>
      </div>
    </blockquote>
    <br class="">
    I think what you are really saying here is: if you want immutable
    records, wait for value records, don't try to cram them in early? 
    Then a record inherits the finality of the class kind that it is
    describing.  And same with field accessibility.  <br class=""></div></div></blockquote><div class=""><br class=""></div></div>Value records don't support recursion, so are useless for many applications.<div class=""><br class=""></div><div class="">The sweet spot for records is immutable fields of any type. If the way to express that is to repeat "final" a bunch of times in the declaration, we will have failed.</div></div></div></blockquote><div><br class=""></div><div>To define "failed" more clearly: sure people will still use Java, they'll happily use the feature, things will be fine. But we'll be asking every record user to pay a tax (a handful of of "final" keywords) to accommodate the few weirdos who want mutable records.</div><div><br class=""></div><div>Underlying this is my expectation that most record declarations will be short (many one-liners), and most will not need mutable fields.</div><div><br class=""></div><div>The "non-final" keyword is a reasonable way to solve this problem without asking everyone to pay a tax. But Kevin's critique is also reasonable.</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">It's a fair point that we are comfortable with "implicitly always final", but "final by default" is a new thing. And if there's a way to describe record-like things that have mutable fields without a 'non-final' keyword, great. But I think we need to spell those things using something other than "record Foo(int x, int y)".</div></div></div></blockquote><div><br class=""></div></div>What else could we do? Don't take these random ideas too seriously, but: maybe the declaration is a "mutable record"? Or just a "class", with some other signal that many record-like features are relevant? Or maybe the mutable fields appear in a different context?<div class=""><br class=""></div><div class="">I feel like we could probably come up with something reasonable if we felt that final by default with a "non-final" opt-in is too confusing.</div><div class=""><br class=""></div><div class="">—Dan</div></body></html>