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).
OK, we have a terminology confusion over the term "exhaustiveness
checking." I meant that the compiler won't let you write an
inexhaustive switch expression (which, for almost all target types, will
require a default/total pattern), even though it will let you for switch
statements (in the absence of flow constraints to the contrary, such as
a blank local.)
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.
They haven't shifted; I was describing this option as a means of getting
at Kevin's distinction about classpath dependencies. Within a
maintenance domain, you basically never have to worry about your enums
and switches over those enums getting out of sync; across maintenance
domains, you do. So the question was, should we consider treating
cross-module "hope nothing changes between now and runtime" assumptions
more skeptically. It was a thought experiment, not a proposal, aimed at
closing the loop (since this thread has had an awful lot of
talking-past-each-other.)
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();
We'd not do anything for switch statements. Exhaustiveness checking is
only for switch expressions in any case.
But, your point is taken; *not* having a default in a situation that
requires exhaustiveness acts as a type-check on that exhaustiveness, and
saying default will then cover up any sins. I get it.