On Fri, Apr 1, 2022 at 9:29 AM Brian Goetz <brian.go...@oracle.com> wrote:
>
>
> > assert new Object().hasIdentity();
> > assert !new Point().hasIdentity();
> >
> > But the 'hasIdentity' method can contain arbitrary logic, and doesn't 
> > necessarily need to correlate with 'getClass().isIdentityClass()'.
>
> More precisely, we were being held hostage to the nature of interfaces;
> by using `implements IdentityObject` as our measure of id-ness, we
> forced legacy Object instances to be instances of some other class, so
> that Object didn't need to implement the interface.
>
> > I don't see a useful way to generalize this to other "both kinds" classes 
> > (for example, any class with an instance field must be an identity class or 
> > a value class). But since we have to make special allowances for Object one 
> > way or another, it does seem plausible that we let 'new Object()' continue 
> > to create direct instances of class Object, and then specify the following 
> > special rules:
> >
> > - All concrete, non-value classes are implicitly identity classes *except 
> > for Object*
> >
> > - The 'new' bytecode is allowed to be used with concrete identity classes 
> > *and class Object*
> >
> > - Identity objects include instances of identity classes, arrays, *and 
> > instances of Object*; 'hasIdentity' reflects this
> >
> > - [anything else?]
> >
> > There's some extra complexity here, but balanced against the cost of making 
> > every Java programmer adjust their model of what 'new Object()' means, and 
> > corresponding coding style refactorings, it seems like a win.
> >
> > Thoughts?
>
> Seems like a win.
>

The alternative - which we've been exploring till now - is to have the
VM do some magic to turn:

0: new  #2                  // class java/lang/Object
3: dup
4: invokespecial #1    // Method java/lang/Object."<init>":()V

into the `new` of a VM-specified Object subclass, and to allow
invoking a super-class constructor on it rather than its own
(remember, the instance is an Object subclass).

That's a lot of magic we can do away with through specification and
some careful API design.  Seems like a win.

The careful API design will be key as I can see a lot of corner cases
related to `obj.getClass().isIdentityClass() != obj.hasIdentity()`.
Do we have a sketch of what the apis for this would look like?  I'm
assuming these are just for expository purposes as isIdentityClass()
really needs to return a trinary value - {true, false, maybe}.

--Dan

Reply via email to