<div dir="ltr">A few small follow-ups:<br><div><br></div><div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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">Upon further research, the statistic that 2.4% of our switch statements are simulating `case null` has mostly held up - it's somewhere between 2.0 and 2.3%. (Note that our development practices are relatively null-hostile, so the value would likely be higher in other codebases.)</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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">But I also found that of<span> </span><i>these</i>, 62-81%<span> </span>are doing it to give null the same behavior as default. Compared to (of course) 19-38% giving null distinct behavior. (That wide range is a 90% confidence interval and could be narrowed if it were actually helpful.) So, what this tells us is that `case null` without the ability to combine it with `default` would indeed be a dissatisfying change.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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">However, having reviewed 67 samples (across both kinds) manually, I can confirm that (so long as we do have the ability to combine `default` and `case null` together) they do simplify pretty nicely with the proposed change. I had expected to find a number of examples where null could instead be canonicalized to another value, which would then enable the switch to work as written. However, it's only worth doing that when it "feels right" and not like a hack, and it turned out there were only a small handful of examples like that.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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">So (as previously conceded) the change IS a win for these cases. The question really is just about how hamstrung we are or aren't by the decisions already set in stone for null switch in previous versions. My data won't do anything to settle it; it comes down to a squishy judgment call about what best protects whatever measure of conceptual simplicity switch can hang onto.</div></div><div><br></div><div>ftr, my request continues to be only that we hold off on making any change regarding null for now.</div><div><br></div><div><br></div><div><br></div><div><br class="gmail-Apple-interchange-newline"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 27, 2018 at 8:59 AM, Kevin Bourrillion <span dir="ltr"><<a href="mailto:kevinb@google.com" target="_blank">kevinb@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>From newest spec:<blockquote style="color:rgb(0,0,0);font-family:sans-serif;font-size:14.4px;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;text-decoration-style:initial;text-decoration-color:initial"><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><em><br class="m_-3787413573978680605gmail-Apple-interchange-newline">ClauseLabel</em></strong>:<p></p></blockquote><blockquote style="color:rgb(0,0,0);font-family:sans-serif;font-size:14.4px;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;text-decoration-style:initial;text-decoration-color:initial"><blockquote><p><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><em>CasePattern</em><span> </span><code style="white-space:pre-wrap;font-size:14.04px">-></code></strong></p></blockquote></blockquote><blockquote style="color:rgb(0,0,0);font-family:sans-serif;font-size:14.4px;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;text-decoration-style:initial;text-decoration-color:initial"><p><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><em>CasePattern</em>:</strong></p></blockquote><blockquote style="color:rgb(0,0,0);font-family:sans-serif;font-size:14.4px;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;text-decoration-style:initial;text-decoration-color:initial"><blockquote><p><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><code style="white-space:pre-wrap;font-size:14.04px">case</code><span> </span><em>Pattern</em><span> </span>{<span> </span><code style="white-space:pre-wrap;font-size:14.04px">,</code><span> </span><em>Pattern</em><span> </span>}</strong><br><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><code style="white-space:pre-wrap;font-size:14.04px">default</code></strong></p></blockquote></blockquote><blockquote style="color:rgb(0,0,0);font-family:sans-serif;font-size:14.4px;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;text-decoration-style:initial;text-decoration-color:initial"><p><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><em>Pattern</em>:</strong></p></blockquote><blockquote style="color:rgb(0,0,0);font-family:sans-serif;font-size:14.4px;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;text-decoration-style:initial;text-decoration-color:initial"><blockquote><p><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><em>ConstantExpression</em></strong><br><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><em>EnumConstantName</em></strong><br><strong style="background-color:rgb(208,255,208);font-weight:inherit;border-bottom:1px dotted rgb(160,160,160)"><code style="white-space:pre-wrap;font-size:14.04px">null</code></strong></p></blockquote></blockquote><br></div><div>Just a reminder that we still have this conflict to resolve. Even when you learn the wart that `default` is not covering null, there is no way to <i>make</i> it do so without repeating the RHS. We need `default, case null:`.<br></div><div><br></div><div>Of course, my preferred resolution is to <b>hold off</b> on `case null` support for now. I'd like to give one honest attempt at a full argument; I hope to get an engaged response to it, and then if a decision is made against it, I'll move on, figure I was wrong, and never speak of it again. :-)</div><div><br></div><div>~~</div><div><br></div><div>1. For the sake of argument I'll just concede the notion that today's null behavior in switch was a mistake and if we could turn back time we would change it.</div><div><br></div><div>2. On the flip side, I think that proponents of the feature can probably concede that we would <i>never</i> have designed it in the now-proposed way for a fresh language; it <i>is</i> a permanent wart brought about by historical accident only. (Yes?) So, I assume that proponents recognize that rejecting this change is at least <i>defensible</i>, by appealing to the compatibility constraints we inherited. We should not need to worry that we will "look like idiots" (or whatever terms our deepest fears phrase themselves in :-)).</div><div><br></div><div>3. Many users since 2004 have said, and will continue to say, that they wish `case null` were allowed. However, I don't think we can assume they are necessarily comparing today's behavior to the <i>actual</i> feature we are proposing, with its warts. It is likely and natural that they are really comparing today's behavior to the time-machine feature of our having supported `case null` from the start. Therefore I think we have to take most such requests with a grain of salt.<br></div><div><br></div><div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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;text-decoration-style:initial;text-decoration-color:initial">4. Yes, sometimes users do write code that simulates `case null` and that code could be nicely simplified if null were allowed in switch. I can do a better job of quantifying the incidence of this need in our large codebase<span> </span>if necessary (but have been prioritizing string literal research for now). But fundamentally, the feature<span> </span><i>is</i> a win, for<span> </span><i>these</i> examples.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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;text-decoration-style:initial;text-decoration-color:initial"><br></div></div><div>5. It has been implied that patterns are what make the current null treatment "untenable". To me, I don't think this argument has been made convincingly yet. It seems to add up to "there may be a few more of those cases where you bump up against the prohibition and think 'oh yeah, grrrr, can't switch directly on null because of reasons no one understands!'" But fundamentally it seems like the same problem it already was.</div><div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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;text-decoration-style:initial;text-decoration-color:initial"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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;text-decoration-style:initial;text-decoration-color:initial">6. That benefit has to be weighed against the damage we will be causing. Here is the meat of it: </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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;text-decoration-style:initial;text-decoration-color:initial">- `default` will no longer mean default. There is really no way around that.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;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;text-decoration-style:initial;text-decoration-color:initial"><span style="font-style:normal">- Null will be treated unaccountably differently from all other values in switch. It becomes harder to explain how switch works -- "sorry, no null" is at least easy. Instead it's "well, switch </span><i>itself</i> allows null, but it assumes you want a `case null` that throws if you don't say otherwise". Looked at without knowing all the baggage, is this not a bit bizarre?</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;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;text-decoration-style:initial;text-decoration-color:initial">- Also (back to how this email started), this appears to be the only factor forcing us to introduce a `default, case x` syntax we would never otherwise need - or to mint some other bespoke construction we would, again, never otherwise need.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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;text-decoration-style:initial;text-decoration-color:initial"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;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;text-decoration-style:initial;text-decoration-color:initial">From where I sit, the cost is clearly too great compared to the benefit. While "never doing anything at all about this" might not be the solution, I am at least confident that the current proposal is not the right solution either, and I'd like to convince us to bench it.</div><div><br></div>But again - if we can make either decision clearly, I'll be done here, and not even grumpy.</div><div><br class="m_-3787413573978680605gmail-Apple-interchange-newline"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 27, 2018 at 8:03 AM, Gavin Bierman <span dir="ltr"><<a href="mailto:gavin.bierman@oracle.com" target="_blank">gavin.bierman@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I have uploaded the latest draft of the spec for JEP 325 at <a href="http://cr.openjdk.java.net/~gbierman/switch-expressions.html" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~gb<wbr>ierman/switch-expressions.html</a><br>
<br>
Changes from the last version:<br>
* Supports new -> label form in both switch expressions and switch statements<br>
* Added typing rules for switch expression<br>
* Restrict the type of a selector expression to not include long, double and float as previously proposed<br>
* Misc smaller changes from community feedback (thanks!)<br>
<br>
Comments welcomed!<br>
<span class="m_-3787413573978680605HOEnZb"><font color="#888888">Gavin<br>
</font></span><div class="m_-3787413573978680605HOEnZb"><div class="m_-3787413573978680605h5"><br>
> On 12 Apr 2018, at 22:27, Gavin Bierman <<a href="mailto:gavin.bierman@oracle.com" target="_blank">gavin.bierman@oracle.com</a>> wrote:<br>
> <br>
> I have uploaded a draft spec for JEP 325: Switch expressions at <a href="http://cr.openjdk.java.net/~gbierman/switch-expressions.html" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~gb<wbr>ierman/switch-expressions.html</a><br>
> <br>
> Note there are still three things missing:<br>
> <br>
> * There is no text about typing a switch expression, as this is still being discussed on this list.<br>
> * There is no name given for the exception raised at runtime when a switch expression fails to find a matching pattern label, as this is still being discussed on this list.<br>
> * The spec currently permits fall through from a "case pattern:” statement group into a "case pattern ->" clause. We are still working through the consequences of removing this possibility.<br>
> <br>
> Comments welcomed!<br>
> Gavin<br>
<br><span class="HOEnZb"><font color="#888888">
</font></span></div></div></blockquote></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br><div class="m_-3787413573978680605gmail_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>
</font></span></div></div>
</blockquote></div><br><br clear="all"><div><br></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>