2. Substitutability
Remi: lambda examples use ==. None use == followed by .equals, in fact
none use .equals.
Karen: other searches have found 10-50% use == followed by .equals
Remi: Hard to find cases with static Object/Interface and dynamic
Lambda today
Code that knows what it is dealing with generally uses either `==` or
`.equals()` but not both.
Generic code (including dynamically typed code, like pre-generic
collections) generally use `==` followed by `.equals()`, but sometimes
just uses `.equals()` (which is OK). Just using `==` is, of course,
dangerous, unless you know that you are dealing with constrained
instances (enums, interned strings, etc.)
The historical route by which we got here is:
- In the interpreted days, `==` was a fast filter for `.equals()`,
since when crawling a list, most things are not equal to what you're
looking for;
- Because `==` was historically fast, it is harmless as a pre-check.
Now, method invocation got faster, and `==` is going to get slower, so
obviously the equilibrium will change.
Karen: Challenges:
component-wise substitutability
- primitives - usual check (floating point extra care)
- pojos - non-Object/Interface - reference comparison
- value type - static or dynamic (Object/Interface) - requires
recursive check
Concerns:
performance - due to lots of fields or depth or both
could get StackOverflowError from unbounded links
e.g. for a valid use case - tree-node
Is it appropriate for acmp to perform a substitutability check? It was
intended as a short circuit pretest to a longer test.
I am still preparing my armaments for this assault :)
3. Nullability
Editor’s note: LW2: QPoint; null-free reference to Point. LPoint;
nullable box for Point.
I would prefer to reframe this as "opting into protection against
uninitialized values".