I could live with this. It doubles down on “everything is an object”, and something might be modeled separately as a non-object a “value”, is just a sub-kind of object, hence “value object”.

So the real big divide is not between objects and non-objects, but between value-objects and identity-objects. And, as befits a world where everybody is in the object family, it’s a gentle divide, since values and identities have lots in common: references, methods, `extends Object`. Meanwhile, the symmetric difference of value and identity contains, on the one side, the option for “direct” storage (whatever that means; it’s vague but real), and on the other side mutability, etc.

A couple more comments below:

On 11 Aug 2022, at 13:08, Brian Goetz wrote:

…So:

 - classes have instances, which are objects
 - some classes are identity classes and some are value classes
   - instances of identity classes have identity, are called identity objects    - instances of value classes have no identity, are called value objects
 - any objects can be the target of an object reference
   - Polymorphic types like Object or Runnable may refer to identity or value objects  - value objects can be represented/stored/manipulated directly as well, like our old friend int
 - legacy primitive are value objects now!
   - everything is an object
 - The type P.ref is a reference type, it consists of references to instances of P

Tedious pedant is tediously pedantic:  or `null`.

 - The type P.val is a value type, it consists of instances of P, which are value objects
 - Integer is a reference type, int is a value type

Maybe emphasize the linkage: `Integer.val`, `int.ref` are a aliases for `int` and `Integer`


This isn't much different from the previous "VAO" presentation, other than being more explicit about saying "value objects" rather than just values --
does that help at all?

I think it does. Saying “values” unqualified suggests (misleadingly for VAO) that not everything is an object.

Reply via email to