[
https://issues.apache.org/jira/browse/JDO-751?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15146467#comment-15146467
]
Renato Garcia commented on JDO-751:
-----------------------------------
Treating it just as T on the APIs/query would require you to convert your
Optional to nullable references again in order to pass it as a parameter in a
query, and something that you want to avoid. Ideally when using Optional idiom
you don't convert it back and forwards to null, you just use your Optional ref.
I believe that proper support of Optional idiom in JDO would mean not forcing
people to write null and converting Optional values back and forward to
nullable refs.
I reckon that exposing Optional<T> as the type on the API/Query makes the
solution more consistent, regular and requires less special cases, except for
the auto de-referencing of course, which is part of the proposed solution
anyway.
In my view, there are similarities in boxing of primitives and the Optional,
however there is a key difference: When using boxing they represent the same
value, whereas "null" and "empty" are just not the same thing - you are not
wrapping null (this would equivalent to {{Optional.of(null)}} which throws an
NPE). My opinion is that this is a fundamental difference and therefore
important to keep the semantics in this scenario. On the other hand, when
querying using "null" on a Optional field, the result would be less relevant
because, again, it makes no sense when using Optional to do so (even though it
is possible in Java, guess what? Also doesn't make sense since they shouldn't
be null and being null is an error(NPE), hence no use in practice). So I think
it is reasonable that in practice for this scenario, it could either be invalid
or dependent on the underlying implementation/datastore; but again, the only
single and simple reason you'd use Optional is to replace the usage of null.
Nevertheless, if one day someone manage to use null and Optional together (kind
of a paradox?!?!), in a super clever way, I'm sure they will have a solution
that overcomes this limitation as well! :)
Regarding viewing Optional<T> as T, there are some implications such as how to
handle metadata. For instance, what {{MemberMetadata.getFieldType}} should
report? T or Optional<?> - in either case how do you represent that with type
erasure in mind and JDO metadata model keeping both types, preferably without
causing too much impact and discrepancy with existing approach.
A possible alternative would be to view Optional<T> as a container of <T>, or
simply a collection, which happens to have zero or one element only. From my
experience, in my attempts to implement an experimental support for Optional
types in DN, I found the container approach more aligned and easier to abstract
in terms of current JDO concepts/metadata; requiring less forgery - possibly
because it is closer to what it actually is being represented. Of course this
conclusion is also highly influenced by the DN implementation, but I think it
is still valid observation. It's worth noting that I think they are both valid
views after having explored both paths.
> Support for Java8 Optional
> --------------------------
>
> Key: JDO-751
> URL: https://issues.apache.org/jira/browse/JDO-751
> Project: JDO
> Issue Type: New Feature
> Components: specification, tck
> Reporter: Andy Jefferson
>
> java.util.Optional provides a feature that is available in other languages.
> Since JDO 3.2 will be for Java8+ then it makes sense to add support for this
> as a "supported persistable type"
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)