[sealed] Use 'open' instead of 'non-sealed'?

Brian Goetz brian.goetz at oracle.com
Tue Jan 26 14:23:27 UTC 2021



> The 'non-sealed' keyword looks not very java-ish.

There was a method to this madness.  The goal is to *make* it Java-ish, 
by adopting this convention uniformly whenever we need the opposite of 
something.  So when we need non-static, non-final, non-abstract, etc, 
these are ready and waiting for us, and each reinforces the others.  It 
is the first one that bears the slings and arrows.

Consider the opposite of `final`, which we went through a bikeshed-paint 
on, but in the end didn't need immediately.  The "obvious" opposite of 
final for a field might be "mutable", but that's a terrible modifier for 
a class or methods.  Similarly, an opposite of final for classes or 
methods might be "open".  But you see how this leads to an irregular 
taxonomy, where the opposite of X isn't even consistent across places 
where X can be used.  This is actually what led us to the non- prefix, 
even though sealed was the first place to get it.

You could also think of this as a meta-bikeshed-budget-management move; 
without it, every keyword needs its own bikeshed to determine its 
opposite.  And, knowing the community, every choice we make ("mutable") 
will have a half-life of complaints over something ultra-trivial -- only 
to be repeated on the next one.  By picking a scheme that can be applied 
consistently, we avoid all that.

So while "open" may be locally better (and I don't disagree), I think it 
is globally worse.

As a minor note, `open` means something already in the context of a 
module descriptor -- "open to deep reflection".  (ANd in fact, we can 
imagine that we may very well need this concept in the language.)


> It adds cognitive
> load, especially to non-native speakers, as it includes the negation
> inside. Also, it complicates tooling implementation (in particular,
> lexing Java programs). Probably some of us want to move forward the
> hyphenated keywords proposal and need a guinea pig to experiment with,
> but this doesn't seem enough reason to justify its use.
>
> I suggest using the 'open' contextual keyword instead. The 'open'
> class/interface means that it can be inherited without any
> restriction. 'open', 'sealed', and 'final' keywords are mutually
> exclusive. Any class/interface is either 'open', or 'sealed', or
> 'final', no other option. The classes that don't directly
> extend/implement sealed classes/interfaces are implicitly 'open'
> (though it's possible to redundantly specify the 'open' keyword). The
> classes that extend/implement sealed class/interface must specify
> open/sealed/final explicitly.
>
> What do you think?
>
> With best regards,
> Tagir Valeev.



More information about the amber-spec-experts mailing list