A minor bikeshed comment: We're asking users to change their `new
Object()` to `IdentityObject.newIdentity()`, and they may ask "why do I
have to say 'Identity' twice"? (And by ask, I mean grumble, because
we're already asking them to change their working code.)
After a few minutes of thought, I think it might be a better fit to put
this at Objects::newIdentity. The methods in Objects are conveniences
that users could write themselves, which this basically is -- there's
nothing special about this method, other than having a preferred
alternative to `new Object()` which users will understand. So parking
this where the Object conveniences go seems slightly lower friction.
On 6/2/2021 10:50 AM, Dan Smith wrote:
On May 8, 2021, at 1:20 PM, Brian Goetz <brian.go...@oracle.com> wrote:
I agree that we can introduce the new API point immediately. The 17 window
hasn't even closed yet! But we'd have to get a move on. But realistically, we
can expect it to be several years before we are comfortable erroring on the
`new Object()` constructor.
Update: we spent a little time discussing "what does this API look like?", and
settled on:
- A new static factory method, java.lang.IdentityObject.newIdentity()
- A possibly-private implementation class, java.lang.Identity or
jdk.internal.Identity
- javac treats 'new Object()' as equivalent to 'IdentityObject.newIdentity()',
with a warning
- the JVM executes 'new java/lang/Object' by creating an instance of
'java/lang/Identity'
The advantage of putting the factory in an interface is that static interface
methods aren't inherited. (If we were to put it in Object, it would pollute the
method namespace of all classes.)
Of course these details can evolve, but as it stands, there's not a good path
to introducing the API before we introduce primitive objects—IdentityObject has
no reason to exist without primitive objects. So efforts to get people to
migrate to something new will need to wait until then. (As discussed earlier in
the thread, that's fine—we're inevitably going to have a period of time when
'new Object()' does something weird.)