<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <div class="markdown-here-wrapper" data-md-url="" style="">
      <p style="margin: 0px 0px 1.2em !important;">Hi John</p>
      <p style="margin: 0px 0px 1.2em !important;">On 18/01/2024 19:38,
        John Bossons wrote:</p>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote type="cite" cite="mid:CACvEv_wHnpkrQ3vq1thJRig_mGLskPFO_JH+6XD+M8yfDUxQKw@mail.gmail.com">Why
          complicate the specification with an implicit constructor that
          a developer will never explicitly invoke? Why permit a
          developer to 'opt in' to non-atomic?</blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <p style="margin: 0px 0px 1.2em !important;">I believe you are
        coming at this from the wrong angle. The implicit constructor
        is, at its core, a mechanism for the class to advertise that it
        has a zero instance (as the JEP calls it [1]).</p>
      <p style="margin: 0px 0px 1.2em !important;">This means that
        whenever a default value of the class has to be materialized
        it’s as if the impliict constructor was called.</p>
      <p style="margin: 0px 0px 1.2em !important;">This are some of the
        ways this can happen (there’s probably more):</p>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 0px;">when you allocate arrays</li>
        <li style="margin: 0.5em 0px;">when you create a <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">MethodHandle</code>
          which returns the zero value of a given class (see <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">MethodHandles::zero</code>)</li>
        <li style="margin: 0.5em 0px;">if we ever provide a syntax to
          say <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Foo.default</code>/<code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Foo.zero</code></li>
      </ul>
      <p style="margin: 0px 0px 1.2em !important;">In other words, once
        a value class has an associated zero-instance, developers can
        materialize that zero-instance in many different ways. Because
        of that, the point you raise that implicit constructors make you
        declare a constructor that you don’t want your clients to invoke
        is a bit off the mark, because clients can maetrialize
        zero-instances anyway. Actually, advertising it as an API point
        makes it quite clear: the maintainer of that value class has to
        be prepared to handle cases where all fields are zeroed - that’s
        part of its API contract.</p>
      <p style="margin: 0px 0px 1.2em !important;">Zooming back a bit,
        you seem to favor a model where the cost is pushed to every read
        of an array element, or flattenable field. Reads are (way) more
        common that writes, which is why the current proposal only lets
        you build array types (and flattenable fields) which make sense
        given the value type under consideration. If you want to build a
        non-null container, fine, but the type of the container must
        better support the “all zero” configuration, since that’s the
        paintbrush the JVM will use to paint the container bits. This
        means that, array creation of a null-restricted value is the
        same as for a regular identity class (all bits zeros) and, since
        the value class explicitly declared its support for the
        zero-instance configuration, no check is required on reads.</p>
      <p style="margin: 0px 0px 1.2em !important;">And, zooming back
        even more (now we’re up in the clouds :-) ), the model we’re
        trying to achieve here is one where you get more (flattening)
        guarantees, by progressively giving up other guarantees. For
        example: </p>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 0px;">
          <p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">opt-out
            of identity (use <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">value</code>)
            -> enables better flattening/scalarization (on the
            stack), allow flattening (but with some extra bits to handle
            nulls)</p>
          <ul style="margin: 1.2em 0px;padding-left: 2em;margin: 0px; padding-left: 1em;">
            <li style="margin: 0.5em 0px;">opt-out of zero-instance
              protection (use implicit constructors) -> removes the
              extra null state from the flattened storage</li>
            <li style="margin: 0.5em 0px;">opt-out of nullability (use
              null-restricted types) -> allows flattening of
              fields/array elements</li>
            <li style="margin: 0.5em 0px;">opt-out of atomic updates
              (use non-atomic) -> allows flattening of types that are
              bigger than N (where N defined by the JVM)</li>
          </ul>
          <p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">You
            can see this as a series of step that takes you, smoothly,
            from an identity class such as <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">java.util.ArrayList</code>,
            down to something simpler and simpler, until you get to <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">int</code>,
            a primitive type (which, not coincidentally, has given up
            exactly the same guarantees listed above!). That is, maximum
            flattening (e.g. int-like) is not a simple on/off switch,
            but, rather, a property that emerges when the treatment of
            the value being flattened can be relaxed along <em>all</em>
            the axis shown above. This model is described, in much
            better words than the ones I used here, in Brian’s document
            [2].</p>
        </li>
      </ul>
      <p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
      <p style="margin: 0px 0px 1.2em !important;">[1] - <a href="https://openjdk.org/jeps/8316779" class="moz-txt-link-freetext">https://openjdk.org/jeps/8316779</a><br>
        [2] - <a href="https://github.com/openjdk/valhalla-docs/blob/main/site/design-notes/state-of-valhalla/02-object-model.md" class="moz-txt-link-freetext">https://github.com/openjdk/valhalla-docs/blob/main/site/design-notes/state-of-valhalla/02-object-model.md</a></p>
      <div title="MDH:PHA+SGkgSm9objxicj48L3A+PGRpdiBjbGFzcz0ibW96LWNpdGUtcHJlZml4Ij5PbiAxOC8wMS8y
MDI0IDE5OjM4LCBKb2huIEJvc3NvbnMgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIHR5cGU9
ImNpdGUiIGNpdGU9Im1pZDpDQUN2RXZfd0hucGtyUTN2cTF0aEpSaWdfbUdMc2tQRk9fSkgrNlhE
K004eWZEVXhRS3dAbWFpbC5nbWFpbC5jb20iPldoeSBjb21wbGljYXRlIHRoZSBzcGVjaWZpY2F0
aW9uIHdpdGggYW4gaW1wbGljaXQgY29uc3RydWN0b3IgdGhhdCBhIApkZXZlbG9wZXIgd2lsbCBu
ZXZlciBleHBsaWNpdGx5IGludm9rZT8gV2h5IHBlcm1pdCBhIGRldmVsb3BlciB0byAnb3B0IApp
bicgdG8gbm9uLWF0b21pYz88L2Jsb2NrcXVvdGU+PHA+SSBiZWxpZXZlIHlvdSBhcmUgY29taW5n
IGF0IHRoaXMgZnJvbSB0aGUgd3JvbmcgYW5nbGUuIFRoZSBpbXBsaWNpdCBjb25zdHJ1Y3RvciBp
cywgYXQgaXRzIGNvcmUsIGEgbWVjaGFuaXNtIGZvciB0aGUgY2xhc3MgdG8gYWR2ZXJ0aXNlIHRo
YXQgaXQgaGFzIGEgemVybyBpbnN0YW5jZSAoYXMgdGhlIEpFUCBjYWxscyBpdCBbMV0pLjxicj48
L3A+PHA+VGhpcyBtZWFucyB0aGF0IHdoZW5ldmVyIGEgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY2xh
c3MgaGFzIHRvIGJlIG1hdGVyaWFsaXplZCBpdCdzIGFzIGlmIHRoZSBpbXBsaWljdCBjb25zdHJ1
Y3RvciB3YXMgY2FsbGVkLjwvcD48cD5UaGlzIGFyZSBzb21lIG9mIHRoZSB3YXlzIHRoaXMgY2Fu
IGhhcHBlbiAodGhlcmUncyBwcm9iYWJseSBtb3JlKTo8YnI+PC9wPjxwPiogd2hlbiB5b3UgYWxs
b2NhdGUgYXJyYXlzPGJyPiogd2hlbiB5b3UgY3JlYXRlIGEgYE1ldGhvZEhhbmRsZWAgd2hpY2gg
cmV0dXJucyB0aGUgemVybyB2YWx1ZSBvZiBhIGdpdmVuIGNsYXNzIChzZWUgYE1ldGhvZEhhbmRs
ZXM6Onplcm9gKTxicj4qIGlmIHdlIGV2ZXIgcHJvdmlkZSBhIHN5bnRheCB0byBzYXkgYEZvby5k
ZWZhdWx0YC9gRm9vLnplcm9gPC9wPjxwPkluIG90aGVyIHdvcmRzLCBvbmNlIGEgdmFsdWUgY2xh
c3MgaGFzIGFuIGFzc29jaWF0ZWQgemVyby1pbnN0YW5jZSwgZGV2ZWxvcGVycyBjYW4gbWF0ZXJp
YWxpemUgdGhhdCB6ZXJvLWluc3RhbmNlIGluIG1hbnkgZGlmZmVyZW50Jm5ic3A7IHdheXMuIEJl
Y2F1c2Ugb2YgdGhhdCwgdGhlIHBvaW50IHlvdSByYWlzZSB0aGF0IGltcGxpY2l0IGNvbnN0cnVj
dG9ycyBtYWtlIHlvdSBkZWNsYXJlIGEgY29uc3RydWN0b3IgdGhhdCB5b3UgZG9uJ3Qgd2FudCB5
b3VyIGNsaWVudHMgdG8gaW52b2tlIGlzIGEgYml0IG9mZiB0aGUgbWFyaywgYmVjYXVzZSBjbGll
bnRzIGNhbiBtYWV0cmlhbGl6ZSB6ZXJvLWluc3RhbmNlcyBhbnl3YXkuIEFjdHVhbGx5LCBhZHZl
cnRpc2luZyBpdCBhcyBhbiBBUEkgcG9pbnQgbWFrZXMgaXQgcXVpdGUgY2xlYXI6IHRoZSBtYWlu
dGFpbmVyIG9mIHRoYXQgdmFsdWUgY2xhc3MgaGFzIHRvIGJlIHByZXBhcmVkIHRvIGhhbmRsZSBj
YXNlcyB3aGVyZSBhbGwgZmllbGRzIGFyZSB6ZXJvZWQgLSB0aGF0J3MgcGFydCBvZiBpdHMgQVBJ
IGNvbnRyYWN0LjwvcD48cD5ab29taW5nIGJhY2sgYSBiaXQsIHlvdSBzZWVtIHRvIGZhdm9yIGEg
bW9kZWwgd2hlcmUgdGhlIGNvc3QgaXMgcHVzaGVkIHRvIGV2ZXJ5IHJlYWQgb2YgYW4gYXJyYXkg
ZWxlbWVudCwgb3IgZmxhdHRlbmFibGUgZmllbGQuIFJlYWRzIGFyZSAod2F5KSBtb3JlIGNvbW1v
biB0aGF0IHdyaXRlcywgd2hpY2ggaXMgd2h5IHRoZSBjdXJyZW50IHByb3Bvc2FsIG9ubHkgbGV0
cyB5b3UgYnVpbGQgYXJyYXkgdHlwZXMgKGFuZCBmbGF0dGVuYWJsZSBmaWVsZHMpIHdoaWNoIG1h
a2Ugc2Vuc2UgZ2l2ZW4gdGhlIHZhbHVlIHR5cGUgdW5kZXIgY29uc2lkZXJhdGlvbi4gSWYgeW91
IHdhbnQgdG8gYnVpbGQgYSBub24tbnVsbCBjb250YWluZXIsIGZpbmUsIGJ1dCB0aGUgdHlwZSBv
ZiB0aGUgY29udGFpbmVyIG11c3QgYmV0dGVyIHN1cHBvcnQgdGhlICJhbGwgemVybyIgY29uZmln
dXJhdGlvbiwgc2luY2UgdGhhdCdzIHRoZSBwYWludGJydXNoIHRoZSBKVk0gd2lsbCB1c2UgdG8g
cGFpbnQgdGhlIGNvbnRhaW5lciBiaXRzLiBUaGlzIG1lYW5zIHRoYXQsIGFycmF5IGNyZWF0aW9u
IG9mIGEgbnVsbC1yZXN0cmljdGVkIHZhbHVlIGlzIHRoZSBzYW1lIGFzIGZvciBhIHJlZ3VsYXIg
aWRlbnRpdHkgY2xhc3MgKGFsbCBiaXRzIHplcm9zKSBhbmQsIHNpbmNlIHRoZSB2YWx1ZSBjbGFz
cyBleHBsaWNpdGx5IGRlY2xhcmVkIGl0cyBzdXBwb3J0IGZvciB0aGUgemVyby1pbnN0YW5jZSBj
b25maWd1cmF0aW9uLCBubyBjaGVjayBpcyByZXF1aXJlZCBvbiByZWFkcy48L3A+PHA+QW5kLCB6
b29taW5nIGJhY2sgZXZlbiBtb3JlIChub3cgd2UncmUgdXAgaW4gdGhlIGNsb3VkcyA6LSkgKSwg
dGhlIAptb2RlbCB3ZSdyZSB0cnlpbmcgdG8gYWNoaWV2ZSBoZXJlIGlzIG9uZSB3aGVyZSB5b3Ug
Z2V0IG1vcmUgCihmbGF0dGVuaW5nKSBndWFyYW50ZWVzLCBieSBwcm9ncmVzc2l2ZWx5IGdpdmlu
ZyB1cCBvdGhlciBndWFyYW50ZWVzLiAKRm9yIGV4YW1wbGU6CjwvcD48cD4qIG9wdC1vdXQgb2Yg
aWRlbnRpdHkgKHVzZSBgdmFsdWVgKSAtJmd0OyBlbmFibGVzIGJldHRlciAKZmxhdHRlbmluZy9z
Y2FsYXJpemF0aW9uIChvbiB0aGUgc3RhY2spLCBhbGxvdyBmbGF0dGVuaW5nIChidXQgd2l0aCBz
b21lCiBleHRyYSBiaXRzIHRvIGhhbmRsZSBudWxscyk8YnI+Ciogb3B0LW91dCBvZiB6ZXJvLWlu
c3RhbmNlIHByb3RlY3Rpb24gKHVzZSBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMpIC0mZ3Q7IHJlbW92
ZXMgdGhlIGV4dHJhIG51bGwgc3RhdGUgZnJvbSB0aGUgZmxhdHRlbmVkIHN0b3JhZ2U8YnI+Ciog
b3B0LW91dCBvZiBudWxsYWJpbGl0eSAodXNlIG51bGwtcmVzdHJpY3RlZCB0eXBlcykgLSZndDsg
YWxsb3dzIGZsYXR0ZW5pbmcgb2YgZmllbGRzL2FycmF5IGVsZW1lbnRzPGJyPgoqIG9wdC1vdXQg
b2YgYXRvbWljIHVwZGF0ZXMgKHVzZSBub24tYXRvbWljKSAtJmd0OyBhbGxvd3MgZmxhdHRlbmlu
ZyBvZiAKdHlwZXMgdGhhdCBhcmUgYmlnZ2VyIHRoYW4gTiAod2hlcmUgTiBkZWZpbmVkIGJ5IHRo
ZSBKVk0pPGJyPgogIDxicj4KWW91IGNhbiBzZWUgdGhpcyBhcyBhIHNlcmllcyBvZiBzdGVwIHRo
YXQgdGFrZXMgeW91LCBzbW9vdGhseSwgZnJvbSBhbiAKaWRlbnRpdHkgY2xhc3Mgc3VjaCBhcyBg
amF2YS51dGlsLkFycmF5TGlzdGAsIGRvd24gdG8gc29tZXRoaW5nIHNpbXBsZXIgCmFuZCBzaW1w
bGVyLCB1bnRpbCB5b3UgZ2V0IHRvIGBpbnRgLCBhIHByaW1pdGl2ZSB0eXBlICh3aGljaCwgbm90
IApjb2luY2lkZW50YWxseSwgaGFzIGdpdmVuIHVwIGV4YWN0bHkgdGhlIHNhbWUgZ3VhcmFudGVl
cyBsaXN0ZWQgYWJvdmUhKS4KIFRoYXQgaXMsIG1heGltdW0gZmxhdHRlbmluZyAoZS5nLiBpbnQt
bGlrZSkgaXMgbm90IGEgc2ltcGxlIG9uL29mZiAKc3dpdGNoLCBidXQsIHJhdGhlciwgYSBwcm9w
ZXJ0eSB0aGF0IGVtZXJnZXMgd2hlbiB0aGUgdHJlYXRtZW50IG9mIHRoZSAKdmFsdWUgYmVpbmcg
ZmxhdHRlbmVkIGNhbiBiZSByZWxheGVkIGFsb25nIF9hbGxfIHRoZSBheGlzIHNob3duIGFib3Zl
LiBUaGlzIG1vZGVsIGlzIGRlc2NyaWJlZCwgaW4gbXVjaCBiZXR0ZXIgd29yZHMgdGhhbiB0aGUg
b25lcyBJIHVzZWQgaGVyZSwgaW4gQnJpYW4ncyBkb2N1bWVudCBbMl0uPGJyPjwvcD48cD48L3A+
PHA+TWF1cml6aW88L3A+PHA+WzFdIC0gaHR0cHM6Ly9vcGVuamRrLm9yZy9qZXBzLzgzMTY3Nzk8
YnI+WzJdIC0gaHR0cHM6Ly9naXRodWIuY29tL29wZW5qZGsvdmFsaGFsbGEtZG9jcy9ibG9iL21h
aW4vc2l0ZS9kZXNpZ24tbm90ZXMvc3RhdGUtb2YtdmFsaGFsbGEvMDItb2JqZWN0LW1vZGVsLm1k
PGJyPjwvcD4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>