I have a utility class for interacting with the Datastore (GAE's in-built Datastore in my case) and it has methods like:
//Class GaeDataUtil
public static <T> Optional<Key<T>> saveEntity(T entity)
(Optional
is from the Guava library and Key<T>
from Objectify, although I doubt any of this makes a difference.)
I want my (minimal) hierarchy of entities to have a .save()
method. So that for:
public class User extends RootEntity
where RootEntity
provides:
public Optional<Key<T>> save() {
//Skipping the error-handling.
return GaeDataUtil.saveEntity(this);
}
I can write:
User myUser = new User();
// set some properties
Optional<Key<User>> optKey = myUser.save();
But of course that doesn't work because a call to myUser.save()
returns Optional<Key<RootEntity>>
not Optional<Key<User>>
as I want.
I can avoid this issue by typecasting in User.save()
(and Account.save()
and Project.save()
etc. etc.) and suppressing warnings, but even if there are only (say) 10 entity classes extending RootEntity
, that's still a fair bit of boilerplate code to write just to typecast. Also, I think that much of the benefit of having a class hierarchy is lost if I have to write code (however minimal) for every derived class (there will be other, similar methods too).
Is there a better solution to this?
Update: using Java 7.