It's a great start, but the key difference is that we need to be able to
apply this process to *our own* types, not just the JDK types. Really, we
should see whatever we need to do for JDK types as a clue to what other
library owners will need as well.

Understanding this now, I hope you'll reread the proposal?

(Secondarily... why are we warning only on synchronization, and not on `==`
or (marginal) `identityHC`?)


On Tue, Apr 26, 2022 at 10:09 AM Brian Goetz <brian.go...@oracle.com> wrote:

> How much of this is already covered by https://openjdk.java.net/jeps/390 ?
>
> On Apr 25, 2022, at 11:12 PM, Kevin Bourrillion <kev...@google.com> wrote:
>
> So I want to make my class identityless. But -- whoops! -- I released it
> years ago and it has lots of usages. And though I've labeled it as
> "value-based", any number of these callers are depending on its identity in
> some way or other.
>
> I'd like to put -- let's say an annotation on my class, like
> `@_FutureNonIdentityClass` or whatever, with the following effects:
>
> * I get a warning if I'm breaking any of the rules of
> identityless classes, like if I have a non-final field.
> * Use sites get a warning if they do _anything_ identity-dependent with it
> (==, identity hc, synchronization, ...?)
>
> This would leave me in a good position to add the real identity-forsaking
> keyword later (at which time the annotation becomes redundant and should
> cause a warning until it's removed).
>
> We can address all this in Error Prone, but I'm not sure it should be left
> to that, partly because a bunch of JDK value-based types need this same
> treatment themselves (apparently only the synchronization warning has been
> rolled out so far?).
>
> Could we get this supported in javac itself? The best thing would be to
> roll it out in an even earlier release than bucket 2 types themselves...
> the sooner the better (maybe we could help?).
>
> I think the annotation could be relegated to some one-off module so it
> doesn't pollute the beautiful jdk.base forever.
>
> ~~~
>
> One of the things this means is that people should stop using `==` on
> these value-based classes.
>
> And that is really really good, because what we are planning to do to `==`
> is... really really bad.  Don't misread me: if compatibility is sacrosanct
> then it is probably the least-bad thing we can do! But honestly, it's bad,
> because it's not a behavior that anyone ever *actually wants* -- unless
> they just happen to have no fields of reference types at all. But the fact
> that it does work in that case just makes the whole thing worse, because
> code like that will be a ticking time bomb waiting to do the wrong thing as
> soon as one reference-type field is added at any nested level below that
> point.
>
> What if we give users support for their migration path, so there *are no*
> usages of `==` that need to remain compatible for these types? Then we
> could make `==` *not do anything* at all for bucket-2 classes.
>
> This approach could save us from a lot of pain (longstanding pain and new
> pain) for int and Integer and friends too.
>
> I think Java's historical priority of "compatibility at all costs" has
> been something of an illusion; it still leaves us high and dry when *we*
> want to adopt new features as *we* end up having to make incompatible
> changes to do it. But if we always gave proper support to users' migration
> scenarios then we wouldn't always *need* the absolute compatibility at the
> language level.
>
> ~~~
>
> (Just to try to move the old overton window, what I really think we should
> do is go further and deprecate `==` entirely, introducing
> `System.identityEquals(a, b)` (or maybe `===`) which would only work for
> identity types. Then in time `==` could be reintroduced as a synonym for
> `Object.equals()` and everyone would be happy and write shiny bug-free
> programs.... I know this would be a large deal. Sometime I will have to
> write at length about just how bad the problem of identity-equality
> overuse/abuse has been.)
>
> --
> Kevin Bourrillion | Java Librarian | Google, Inc. | kev...@google.com
>
>
>

-- 
Kevin Bourrillion | Java Librarian | Google, Inc. | kev...@google.com

Reply via email to