On 09/20/2013 07:55 PM, Eamonn McManus wrote:
> yes and no,
> it depends how your RPC framework map errors because if you send an Optional > and then throw an exception in the client you will not have a meaningful stack trace.

I don't understand what this means. Concretely, why would you not want Optional<Something> to be a valid return type of an RMI method?

Hi Éamonn,
yes, returning an Optional for a service means that you may return null which is usually a bad practice, given the overhead of being over the wire, it's usully better to throw an exception with a meaningful error message.


Éamonn

Rémi



2013/9/19 Remi Forax <[email protected] <mailto:[email protected]>>

    On 09/18/2013 07:32 PM, Pete Poulos wrote:

        One use case to consider here is RPC. many RPC frameworks use
        serialization
        to transmit the results of the RPC call over the network. If
        Optional is
        not serializable then you will be unable to return Optional
        results from
        methods invoked via RPC.


    yes and no,
    it depends how your RPC framework map errors because if you send
    an Optional
    and then throw an exception in the client you will not have a
    meaningful stack trace.

    Rémi


        On Sep 18, 2013 11:13 AM, "Joseph Unruh" <[email protected]
        <mailto:[email protected]>> wrote:

            While It's clear that there are performance implications
            to using an
            Optional field, keeping Optional non-serializable doesn't
            do much to
            prevent that from happening. In the vast majority of
            cases, Optional will
            be used in a non-serialized context. So, as preventative
            measures go, this
            isn't a very effective one.

            Second, Optional exists primarily as a mechanism for
            marking that an object
            may be null. This is a design objective. If the objective
            was performance,
            then Optional wouldn't exist. Enforcing this usage on
            people, particularly
            in the narrow context of serialization, is a premature
            optimization. If
            it's useful to have optional exist at the API level in
            order to prevent
            NPEs, why can't it be useful at the individual class level
            to prevent NPEs?

            Cheers,
                Joseph


            On Tue, Sep 17, 2013 at 11:37 PM, Remi Forax
            <[email protected] <mailto:[email protected]>> wrote:

                There is a good reason to not allow Optional to
                implement Serializable,
                it promotes a bad way to use Optional, at least from
                the VM point of

            view.

                For the VM, Optional is a boxing, very similar to a
                boxing to Integer
                (in fact it's a little better because Integer.valueOf
                is badly* specified
                in the JLS
                but that's another story).

                so if you write:
                class Foo {
                   private Optional<String> description;

                   public Optional<String> getDescription() {
                      return description;
                   }
                }

                This implementation id bad for two reasons, the first
                one is that you

            have

                to do
                a double indirection so will double your chance to
                have a value that is

            not

                in the cache but in RAM when you want the underlying
                String.
                The second reason is that the VM will usually not be
                able to remove the
                boxing because the creation of Optional will be too
                far from the use.

                There is a better implementation
                class Foo {
                   private String description;  // warning nullable !

                   public Optional<String> getDescription() {
                      return Optional.fromNullable(**description);
                   }
                }

                It's the same API from the user point of view, but the
                creation of

            Optional

                is in the same inline horizon that it's use if
                getDescription is inlined
                (and here given that the method is really small, the
                is a good chance).
                In that case the VM is able to remove the boxing and
                everybody is happy.

                So making Optional serializable goes in the wrong
                direction.

                cheers,
                Rémi
                * as we now now in 2013, it was less obvious when the
                decision was taken
                circa 2003.


                On 09/18/2013 03:16 AM, Pete Poulos wrote:

                    Optional holds data and while the vast majority of
                    use cases for

            Optional

                    will be to immediately pull the value out and do
                    something, that doesn't
                    change the fact that it is still a data structure,
                    somebody somewhere is
                    going to need to serialize it for some reason.
                     The other data

            structures

                    in the java.util package are Serializable so
                    making Optional

            Serializable

                    makes things consistent.

                    As far as I know the cost of adding Serializable
                    to Optional is
                    negligible,
                    but the cost could be fairly significant to
                    someone who needs to

            serialize

                    it at some point and is unable to do so.

                    Anyhow, I'm currently designing a set of
                    functional (immutable,
                    persistent)
                    data structures for JDK8+ and I'm debating
                    replacing my "Maybe" class
                    (functionally the same as Optional, but with
                    Haskell's naming convention
                    for this data structure) the JDK8 Optional and I'm
                    concerned that the

            lack

                    of Serializable on Optional would cause problems
                    for potential users of

            my

                    API.

                    I'm only using Optional/Maybe to wrap return
                    values from methods so I

            can

                    indicate missing/present values within my data
                    structures, so I could
                    conceivably use Optional and still support
                    serialization.

                    Also, while we are having this discussion, is
                    there an alternative to
                    serialization that is considered superior?  Over
                    the years I have read
                    blog
                    posts by people condemning serialization, but I
                    don't recall seeing any
                    alternatives suggested.

                    Thanks,
                    Pete






                    On Tue, Sep 17, 2013 at 5:32 PM, Vitaly Davidovich
                    <[email protected] <mailto:[email protected]>

                        wrote:

                      Presumably because you may want to have class
                    fields that express

                        nullability via Optional rather than null.
                         Whether that's a good

            design

                        or
                        not is a separate question; conceptually, I
                        don't see a reason why
                        Optional
                        cannot support that.  For "reference", Google
                        Guava's version is
                        serializable.  If someone were to replace
                        their use with jdk's Optional
                        then they will hit exceptions if the owner
                        class is serialized.

                        Sent from my phone
                        On Sep 17, 2013 6:06 PM, "Remi Forax"
                        <[email protected] <mailto:[email protected]>>
                        wrote:

                          On 09/17/2013 11:44 PM, Pete Poulos wrote:

                            Shouldn't java.util.Optional be
                            Serializable?  Is there a good reason
                            for
                            it not be?

                                wrong question.

                            the right one is why do you want Optional
                            to be Serializable.

                               Thanks,

                                Pete

                                  cheers,

                            Rémi






Reply via email to