I'd be in favour of

- Optional for method return values if not performance critical
- Optional can be used for internal methods if it makes sense
- No optional fields

Cheers,
Till

On Mon, Aug 5, 2019 at 12:07 PM Aljoscha Krettek <aljos...@apache.org>
wrote:

> Hi,
>
> I’m also in favour of using Optional only for method return values. I
> could be persuaded to allow them for parameters of internal methods but I’m
> sceptical about that.
>
> Aljoscha
>
> > On 2. Aug 2019, at 15:35, Yu Li <car...@gmail.com> wrote:
> >
> > TL; DR: I second Timo that we should use Optional only as method return
> > type for non-performance critical code.
> >
> > From the example given on our AvroFactory [1] I also noticed that
> Jetbrains
> > marks the OptionalUsedAsFieldOrParameterType inspection as a warning.
> It's
> > relatively easy to understand why it's not suggested to use (java.util)
> > Optional as a field since it's not serializable. What made me feel
> curious
> > is that why we shouldn't use it as a parameter type, so I did some
> > investigation and here is what I found:
> >
> > There's a JB blog talking about java8 top tips [2] where we could find
> the
> > advice around Optional, there I found another blog telling about the
> > pragmatic approach of using Optional [3]. Reading further we could see
> the
> > reason why we shouldn't use Optional as parameter type, please allow me
> to
> > quote here:
> >
> > It is often the case that domain objects hang about in memory for a fair
> > while, as processing in the application occurs, making each optional
> > instance rather long-lived (tied to the lifetime of the domain object).
> By
> > contrast, the Optionalinstance returned from the getter is likely to be
> > very short-lived. The caller will call the getter, interpret the result,
> > and then move on. If you know anything about garbage collection you'll
> know
> > that the JVM handles these short-lived objects well. In addition, there
> is
> > more potential for hotspot to remove the costs of the Optional instance
> > when it is short lived. While it is easy to claim this is "premature
> > optimization", as engineers it is our responsibility to know the limits
> and
> > capabilities of the system we work with and to choose carefully the point
> > where it should be stressed.
> >
> > And there's another JB blog about code smell on Null [4], which I'd also
> > suggest to read(smile).
> >
> > [1]
> >
> https://github.com/apache/flink/blob/master/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroFactory.java#L95
> > [2] https://blog.jetbrains.com/idea/2016/07/java-8-top-tips/
> > [3]
> https://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html
> > [4] https://blog.jetbrains.com/idea/2017/08/code-smells-null/
> >
> > Best Regards,
> > Yu
> >
> >
> > On Fri, 2 Aug 2019 at 14:54, JingsongLee <lzljs3620...@aliyun.com
> .invalid>
> > wrote:
> >
> >> Hi,
> >> First, Optional is just a wrapper, just like boxed value. So as long as
> >> it's
> >> not a field level operation, I think it is OK to performance.
> >> I think guava optional has a good summary to the uses. [1]
> >>> As a method return type, as an alternative to returning null to
> indicate
> >> that no value was available
> >>> To distinguish between "unknown" (for example, not present in a map)
> >> and "known to have no value"
> >>> To wrap nullable references for storage in a collection that does not
> >> support
> >> The latter two points seem reasonable, but they have few scenes.
> >>
> >> [1]
> >>
> https://github.com/google/guava/blob/master/guava/src/com/google/common/base/Optional.java
> >>
> >> Best,
> >> Jingsong Lee
> >>
> >>
> >> ------------------------------------------------------------------
> >> From:Timo Walther <twal...@apache.org>
> >> Send Time:2019年8月2日(星期五) 14:12
> >> To:dev <dev@flink.apache.org>
> >> Subject:Re: [DISCUSS][CODE STYLE] Usage of Java Optional
> >>
> >> Hi everyone,
> >>
> >> I would vote for using Optional only as method return type for
> >> non-performance critical code. Nothing more. No fields, no method
> >> parameters. Method parameters can be overloaded and internally a class
> >> can work with nulls and @Nullable. Optional is meant for API method
> >> return types and I think we should not abuse it and spam the code with
> >> `@SuppressWarnings("OptionalUsedAsFieldOrParameterType")`.
> >>
> >> Regards,
> >>
> >> Timo
> >>
> >>
> >>
> >> Am 02.08.19 um 11:08 schrieb Biao Liu:
> >>> Hi Jark & Zili,
> >>>
> >>> I thought it means "Optional should not be used for class fields".
> >> However
> >>> now I get a bit confused about the edited version.
> >>>
> >>> Anyway +1 to "Optional should not be used for class fields"
> >>>
> >>> Thanks,
> >>> Biao /'bɪ.aʊ/
> >>>
> >>>
> >>>
> >>> On Fri, Aug 2, 2019 at 5:00 PM Zili Chen <wander4...@gmail.com> wrote:
> >>>
> >>>> Hi Jark,
> >>>>
> >>>> Follow your opinion, for class field, we can make
> >>>> use of @Nullable/@Nonnull annotation or Flink's
> >>>> SerializableOptional. It would be sufficient.
> >>>>
> >>>> Best,
> >>>> tison.
> >>>>
> >>>>
> >>>> Jark Wu <imj...@gmail.com> 于2019年8月2日周五 下午4:57写道:
> >>>>
> >>>>> Hi Andrey,
> >>>>>
> >>>>> I have some concern on point (3) "even class fields as e.g. optional
> >>>> config
> >>>>> options with implicit default values".
> >>>>>
> >>>>> Regarding to the Oracle's guide (4) "Optional should not be used for
> >>>> class
> >>>>> fields".
> >>>>> And IntelliJ IDEA also report warnings if a class field is Optional,
> >>>>> because Optional is not serializable.
> >>>>>
> >>>>>
> >>>>> Do we allow Optional as class field only if the class is not
> >> serializable
> >>>>> or forbid this totally?
> >>>>>
> >>>>> Thanks,
> >>>>> Jark
> >>>>>
> >>>>> On Fri, 2 Aug 2019 at 16:30, Biao Liu <mmyy1...@gmail.com> wrote:
> >>>>>
> >>>>>> Hi Andrey,
> >>>>>>
> >>>>>> Thanks for working on this.
> >>>>>>
> >>>>>> +1 it's clear and acceptable for me.
> >>>>>>
> >>>>>> To Qi,
> >>>>>>
> >>>>>> IMO the most performance critical codes are "per record" code path.
> We
> >>>>>> should definitely avoid Optional there. For your concern, it's "per
> >>>>> buffer"
> >>>>>> code path which seems to be acceptable with Optional.
> >>>>>>
> >>>>>> Just one more question, is there any other code paths which are also
> >>>>>> critical? I think we'd better note that clearly.
> >>>>>>
> >>>>>> Thanks,
> >>>>>> Biao /'bɪ.aʊ/
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> On Fri, Aug 2, 2019 at 11:08 AM qi luo <luoqi...@gmail.com> wrote:
> >>>>>>
> >>>>>>> Agree that using Optional will improve code robustness. However
> we’re
> >>>>>>> hesitating to use Optional in data intensive operations.
> >>>>>>>
> >>>>>>> For example, SingleInputGate is already creating Optional for every
> >>>>>>> BufferOrEvent in getNextBufferOrEvent(). How much performance gain
> >>>>> would
> >>>>>> we
> >>>>>>> get if it’s replaced by null check?
> >>>>>>>
> >>>>>>> Regards,
> >>>>>>> Qi
> >>>>>>>
> >>>>>>>> On Aug 1, 2019, at 11:00 PM, Andrey Zagrebin <
> and...@ververica.com
> >>>>>>> wrote:
> >>>>>>>> Hi all,
> >>>>>>>>
> >>>>>>>> This is the next follow up discussion about suggestions for the
> >>>>> recent
> >>>>>>>> thread about code style guide in Flink [1].
> >>>>>>>>
> >>>>>>>> In general, one could argue that any variable, which is nullable,
> >>>> can
> >>>>>> be
> >>>>>>>> replaced by wrapping it with Optional to explicitly show that it
> >>>> can
> >>>>> be
> >>>>>>>> null. Examples are:
> >>>>>>>>
> >>>>>>>>   - returned values to force user to check not null
> >>>>>>>>   - optional function arguments, e.g. with implicit default values
> >>>>>>>>   - even class fields as e.g. optional config options with
> implicit
> >>>>>>>>   default values
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> At the same time, we also have @Nullable annotation to express
> this
> >>>>>>>> intention.
> >>>>>>>>
> >>>>>>>> Also, when the class Optional was introduced, Oracle posted a
> >>>>> guideline
> >>>>>>>> about its usage [2]. Basically, it suggests to use it mostly in
> >>>> APIs
> >>>>>> for
> >>>>>>>> returned values to inform and force users to check the returned
> >>>> value
> >>>>>>>> instead of returning null and avoid NullPointerException.
> >>>>>>>>
> >>>>>>>> Wrapping with Optional also comes with the performance overhead.
> >>>>>>>>
> >>>>>>>> Following the Oracle's guide in general, the suggestion is:
> >>>>>>>>
> >>>>>>>>   - Avoid using Optional in any performance critical code
> >>>>>>>>   - Use Optional only to return nullable values in the API/public
> >>>>>> methods
> >>>>>>>>   unless it is performance critical then rather use @Nullable
> >>>>>>>>   - Passing an Optional argument to a method can be allowed if it
> >>>> is
> >>>>>>>>   within a private helper method and simplifies the code, example
> >>>> is
> >>>>> in
> >>>>>>> [3]
> >>>>>>>>   - Optional should not be used for class fields
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> Please, feel free to share you thoughts.
> >>>>>>>>
> >>>>>>>> Best,
> >>>>>>>> Andrey
> >>>>>>>>
> >>>>>>>> [1]
> >>>>>>>>
> >>>>
> >>
> http://mail-archives.apache.org/mod_mbox/flink-dev/201906.mbox/%3ced91df4b-7cab-4547-a430-85bc710fd...@apache.org%3E
> >>>>>>>> [2]
> >>>>>>>>
> >>>>
> >>
> https://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html
> >>>>>>>> [3]
> >>>>>>>>
> >>>>
> >>
> https://github.com/apache/flink/blob/master/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroFactory.java#L95
> >>>>>>>
> >>
> >>
> >>
>
>

Reply via email to