> On 13 Feb 2020, at 18:42, Jonathan Gibbons <jonathan.gibb...@oracle.com> 
> wrote:
> 
> On 2/13/20 9:32 AM, Pavel Rappo wrote:
>>> On 13 Feb 2020, at 16:00, Jonathan Gibbons <jonathan.gibb...@oracle.com> 
>>> wrote:
>>> 
>>> On 2/13/20 7:50 AM, Pavel Rappo wrote:
>>>> a. jdk/javadoc/internal/doclets/formats/html/AbstractTreeWriter.java:143
>>>> 
>>>> Shouldn't it use equals() instead of `==` in this case? A quick look shows 
>>>> a
>>>> surprising number of reference equality checks on 
>>>> javax.lang.model.element.Name
>>>> and javax.lang.model.element.Element instances. Why would we need to use
>>>> reference equality on types with explicitly defined equals() and 
>>>> hashCode()?
>>> == is correct for Name and Symbol/Element
>> Thanks for the clarification.
>> 
>> Out of curiosity, why is that? I can see that equals() is currently 
>> implemented
>> through reference equality in concrete subtypes of Symbol & Element:
>> 
>>     public boolean equals(Object obj) {
>>         return (this == obj);
>>     }
>> 
>> Still, those types explicitly define equals(). One would think using it is a 
>> must.
>> 
>> Given the current implementation (there's only one that I can see) of Name 
>> it's
>> even more surprising:
>> 
>>     /** Is this name equal to other?
>>      */
>>     @DefinedBy(Api.LANGUAGE_MODEL)
>>     public boolean equals(Object other) {
>>         if (other instanceof Name)
>>             return
>>                 table == ((Name)other).table && index == ((Name) 
>> other).getIndex();
>>         else return false;
>>     }
> 
> 
> javac Name objects are javac's version of interned strings;  we go to the 
> effort of putting them in a unique string table just so that we compare using 
> '--'.
> 
> For both Name and Symbol/Element, equals and hashCode are defined so that you 
> can put them in a collection if you need to, but it is still expected that 
> you can/will use referential equality when possible for performance reasons.  
> And yes, that impl of .equals does look curious.  FWIW, there are two impl of 
> Name; the other one does not provide definitions of .equals and .hashCode.  
> Sigh.

Should we file a bug to investigate this further? That design intent (allowing 
referential equality) should be documented. Current implementations of 
equals/hashCode could then be revisited.


Reply via email to