You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Henrique Mendonca (JIRA)" <ji...@apache.org> on 2013/04/07 14:59:16 UTC
[jira] [Commented] (THRIFT-1871) Better null-safe handling
[ https://issues.apache.org/jira/browse/THRIFT-1871?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13624899#comment-13624899 ]
Henrique Mendonca commented on THRIFT-1871:
-------------------------------------------
Hi Eirik, sorry for the delay again
I think your "scenario2" seems to be quite feasible for now.
Since it would involve only changes on the Java compiler, I'd advise you to open a separated ticket for that so the guys working with the Java library can also give their opinion.
Thank you for sharing your ideas.
ps: Can you not solve that with the normal primitive wrappers, e.g. java.lang.Integer ?? but I leave that to you guys to discuss and decide.
> Better null-safe handling
> -------------------------
>
> Key: THRIFT-1871
> URL: https://issues.apache.org/jira/browse/THRIFT-1871
> Project: Thrift
> Issue Type: Brainstorming
> Components: Compiler (General)
> Reporter: Eirik Sletteberg
> Attachments: Add_nullable_modifier_to_functions.patch
>
>
> Optional fields are not really handled well, especially in java clients. (NullPointerExceptions everywhere)
> Scrooge (Twitter's alternative Thrift compiler implementation) solves this problem by wrapping all optional fields in an Option<T> class. Could this be implemented in Thrift?
> As of today, services have no way of returning empty results; for example
> UserService {
> 1: User getUser(1: i32 id)
> }
> cannot return an empty user if the ID is not found.
> There are a few ways to solve this:
> UserService {
> 1: User getUser(1: i32 id) throws UserNotFoundException
> }
> -- or --
> UserService {
> 1: List<User> getUser(1: i32 id)
> }
> where an empty list is returned of no user is found, and a list containing one item is returned if a user is found.
> -- or --
> UserResult {
> 1: bool exists;
> 2: User user;
> }
> UserService {
> 1: UserResult getUser(1: i32 id)
> }
> I don't like any of them.
> One could solve this by letting the "optional" keyword apply to methods:
> UserService {
> 1: optional User getUser(1: i32 id)
> }
> or adding a new type to the IDL; the Option type:
> UserService {
> 1: Option<User> getUser(1: i32 id)
> }
> and then, like Scrooge does, generate code that wraps the optional fields in an "Option" type, which is null-safe.
> The Option type could also be used in structs:
> struct User {
> 1: i32 id;
> 2: string name;
> 3: optional string email;
> }
> -- or --
> struct User {
> 1: i32 id;
> 2: string name;
> 3: Option<string> email;
> }
> Either way, a null-safe Option wrapper would be used in the generated java code.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira