[ 
https://issues.apache.org/jira/browse/THRIFT-5483?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17522087#comment-17522087
 ] 

Liu Jiayu commented on THRIFT-5483:
-----------------------------------

I'm not the original author nor designer for these part of the code so I'm 
afraid I can't answer your question.

For me personally I'd refrain from using any such generated equals and hashCode 
and comparison methods and instead use my own. My restrictions won't be that 
harsh so I would almost always copy data the moment RPC call and serde using 
thrift is done. I'm not relying on Thrift to do anything other than RPC call 
and serde. YMMV.

Also I don't believe unifying across language by code generation makes sense 
because:
 * thrift is a serde and RPC schema and IDL, it should not be concerned about 
other things like domain object hashing and sort ordering
 * it's technically impossible to have identical behavior of hashing and 
comparison across different languages

> Support customized comparator in Java
> -------------------------------------
>
>                 Key: THRIFT-5483
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5483
>             Project: Thrift
>          Issue Type: Improvement
>          Components: Java - Compiler
>            Reporter: Tian Jiang
>            Priority: Trivial
>         Attachments: screenshot-1.png
>
>
> The generated comparator (and hash code) of Thrift Structs compares two 
> objects by all of their fields, which may cause trouble when used in hash 
> structures.
> For example, I define a struct like:
> {code:java}
> struct Person{
>   1: required i64 id
>   2: required string phoneNumber
> }
> {code}
> The id of a Person is final, while its phoneNumber can be changed.
> Then I use it as a key in a map to record a Person's supervisors:
> {code:java}
> Map<Person, Person> supervisorMap;
> {code}
> Apparently, as the generated comparator of Person will use both id and 
> phoneNumber for comparison and hash if I change the phoneNumber of a Person, 
> I can no longer get it from the map as its hash value changes and it will be 
> distributed to another hash slot.
> Therefore, I wish I could specify the fields that are to be used in 
> comparator and hash code generation. One preferable grammar may be like:
> {code:java}
> struct Person{
>   1: required comparable i64 id
>   2: required string phoneNumber
> }
> {code}
> Then the generated comparator and hash code will only use fields marked with 
> `comparable`, and if no fields are marked with comparable, Java's default 
> comparison and hashcode (using object address) will be used. 



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to