Two comments on the Constants API

mark.reinhold at mark.reinhold at
Mon Jun 4 18:34:09 UTC 2018

2018/6/4 10:28:56 -0700, brian.goetz at
> ...
> So, here's two ways we could reduce this friction.
> 1. Drop Constable (but not CD) off of String and friends (the cost of 
> this is a manageable amount of additional spec+compiler complexity). 
> Now the task reduces to explaining String <: CD. Some work on the spec 
> of ConstantDesc, rewriting it from the perspective of "You probably got 
> here because our mutual friend String gave you a coupon for a free 
> symbolic reference", aiming to minimize the amount of time spent in that 
> cognitive-friction zone between "WTF" and resumption of blissful 
> ignorance, could help. And, CD is not _that_ hard to explain; it's 
> something low-level code can use as the description for a low-level 
> component of a classfile.
> 2. Reintroduce some form of ConstantDesc.OfSelf, say NativeConstant 
> (shed to be painted), which implements both CD and Constable and 
> implements its methods. This is trivial to do, and the Javadoc for this 
> can be much simpler and friendlier than the Javadoc for CD, since it can 
> appeal to "I'm just a convenient supertype for String and four special 
> Number types." The time spent in the cognitive-friction zone is even 
> less. But, its not perfect; while now String only directly extends 
> NativeConstant, CD and Constable will still show up in the list of "all 
> implemented interfaces." This could still be confusing.
> Its possible that the downside of (2) could be further mitigated by 
> Javadoc presentation changes (such as, in the "all implemented 
> interfaces" list, instead of saying "A, B, C", it could say "A, B (via 
> A), C", to make it clear what the inheritance path was. If this list 
> for String said "All implemented interfaces: Serializable, 
> Comparable<String>, CharSequence, NativeConstant, ConstantDesc (via 
> NativeConstant), Constable (via NativeConstant)", it would be clear that 
> the weirdnesses are introduced by NC, and a short trip to the NC docs 
> says "nothing to see here, move along." In other words, maybe this is 
> mostly a tooling problem. (Or maybe this just is creating new problems.)
> We've been in (2) before and I'm fine to go there again; the thing to 
> most like about (2) is that it creates a type that explains the role of 
> these five special types at a higher level. (1) has the advantage of 
> reducing the number of weird types that show up, but only gets us 
> halfway back to blissful ignorance (there are only three numbers in 
> computer science; 0, 1, and n. We're in n now, this gets us back to 1, 
> hence, halfway.)

Of these two options, I’d go with (2).  A `NativeConstant` interface
(or whatever it turns out to be named) is much easier to explain than
`ConstantDesc` since it conveys a meaning that can make sense to
non-experts (and offhand I don’t see how to give `ConstantDesc` itself
such a name).

I agree that a small change to how Javadoc presents lists of implemented
interfaces could mitigate the downside of this option, but I’ll resist
approaching that bikeshed here.  (Personally I usually don’t read the
“All Implemented Interfaces” list unless I really need to, but maybe
that’s just me.)

- Mark

More information about the amber-dev mailing list