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 > >>>>>>> > >> > >> > >> > >