> On Nov 22, 2021, at 2:07 PM, Kevin Bourrillion <kev...@google.com> wrote:
> 
>> On Mon, Nov 22, 2021 at 6:27 AM Dan Heidinga <heidi...@redhat.com> wrote:
>> 
>> I'll echo Brian's comment that I'd like to understand Kevin's use
>> cases better to see if there's something we're missing in the design /
>> a major use case that isn't being addressed that will cause useer
>> confusion / pain.
>> 
> Sorry if I threw another wrench here!
> 
> What I'm raising is only the wish that users can reasonably default to 
> B2-over-B1 unless their use case requires something on our list of "only B1 
> does this". And that list can be however long it needs to be, just hopefully 
> no longer. That's probably how we were looking at it already.

Here's the current list, FYI (derived from JEP 401):

        • Implicitly final class, cannot be extended.
        • All instance fields are implicitly final, so must be assigned exactly 
once by constructors or initializers, and cannot be assigned outside of a 
constructor or initializer.
        • The class does not implement—directly or indirectly—IdentityObject. 
This implies that the superclass is either Object or a stateless abstract class.
        • No constructor makes a super constructor call. Instance creation will 
occur without executing any superclass initialization code.
        • No instance methods are declared synchronized.
        • (Possibly) The class does not implement Cloneable or declare a 
clone()method.
        • (Possibly) The class does not declare a finalize() method.
        • (Possibly) The constructor does not make use of this except to set 
the fields in the constructor body, or perhaps after all fields are definitely 
assigned.

And elaborating on IdentityObject & stateless abstract classes:

An abstract class can be declared to implement either IdentityObject or 
ValueObject; or, if it declares a field, an instance initializer, a non-empty 
constructor, or a synchronized method, it implicitly implements IdentityObject 
(perhaps with a warning). Otherwise, the abstract class extends neither 
interface and can be extended by both kinds of concrete classes.

(Such a "both kinds" abstract class has its ACC_PRIM_SUPER—name to be 
changed—flag set in the class file, along with an <init> method for identity 
classes.)

Reply via email to