On 2018-03-30T15:10:32 -0400
Brian Goetz <brian.go...@oracle.com> wrote:

> Yes, you misunderstood :)
> 
> You would always get an exhaustiveness check.  What you'd not get is the 
> "grace" of having said:
> 
>     case RED:
>     case YELLOW:
>     case GREEN:
> 
> without a default, and having that still be considered exhaustive 
> because these are all the alternatives known at compile time.  It would 
> be like today, where flow analysis sometimes requires you to have a 
> default on an enum switch even though you've covered all the bases.

There's a subtlety to the language here that I think might be throwing
me off.

It's not clear to me what the utility of nominally always having an
exhaustiveness check would be if I end up having to include a "default"
everywhere anyway. If someone adds an enum constant (and I'm compiling
my code against their new code), I want to get compilation errors in
every switch that now needs to be updated. If I have to add a "default"
everywhere in the source, I won't get that (and will have to hope that
my test coverage is good enough to find all the switches that are now
incorrect).

My understanding to date has been that a "default" wasn't going to be
required for enum and sealed types, and that if I didn't provide one,
the compiler would synthesize one that raises an exception... Now
things seem to have shifted somewhat.

I configure my IDE to refuse to allow me to use default on enum
switches, and to treat missing cases as a compilation error:

    switch (e) {
      case RED: ...
      case YELLOW: ...
      case GREEN: ...
    }
    throw new UnreachableCodeException();

I don't specify a default, so the code raises UnreachableCodeException
if someone makes a binary-incompatible change and I've not recompiled,
and the IDE/compiler tells me if someone added an enum constant that
I've not handled by refusing to compile my code.

-- 
Mark Raynsford | http://www.io7m.com

Reply via email to