[External] : Re: Making Object abstract
brian.goetz at oracle.com
Sat May 8 17:02:53 UTC 2021
> We're in complete agreement on needing to support it at the bytecode
> level. The part I'm unclear on is why that requires continuing to
> allow `new Object()` at the source level. Removing it is, of course,
> a source incompatible change with all its attendant pain, but it
> results in the simpler model as suggested by Dan Smith and allows
> making Object abstract.
I agree that if we were starting from scratch, making Object abstract
would be the sensible choice. But there's just sooooooo much code that
does at least one `new Object()` at the source level, and this seems a
questionable place to spend our incompatibility budget. We don't want
people's first experience of Valhalla -- before they even know what it
is -- to be "nothing compiles anymore." That's a way to get started on
the wrong foot.
We can certainly discourage it by warning ("please use
Object.newInstance() instead"), and start the migration early (we can
start by adding Object::newInstance now, and add to the set of
pre-valhalla optional warnings), but it seems like too big a leap to
start erroring on `new Object()` immediately.
> Continuing to allow `new Object()` at the source level will encourage
> puzzlers and confusion as expressions like this will be false only for
> new Object().getClass() == Object.class
> Isn't it better to make this illegal at the source level so the code
> says what it means?
> My (non-exhaustive) examination of uses of `new Object()` in code
> bases I've looked at (which is a small, jvm-centric set of uses) tend
> to fall into two buckets:
> * tests generating objects to validate GCs occur, metrics report
> additional allocations or free space correctly. None of these cases
> care about the Object itself. It's just something to occupy heap
> * allocating a unique object to use as a lock
> Is there some other pattern that suggests keeping `new Object()` at
> the source level is worth the special cases in the model?
Most cases are the lock. And while Joe Java doesn't write this that
often, nearly every library has this once or twice.
So, I agree on the goal, I guess I don't think we can get there in one
go without avoidably burning some goodwill.
More information about the valhalla-spec-observers