I think Dawid raised a very good point here. One of the outcomes should be that we are consistent in our recommendations and requests during PR reviews. Otherwise we'll just confuse contributors.
So I would be +1 for someone to use Optional in a private method if they believe it is helpful -1 to push contributors during reviews to do that On Tue, Aug 20, 2019 at 9:42 AM Dawid Wysakowicz <dwysakow...@apache.org> wrote: > Hi Andrey, > > Just wanted to quickly elaborate on my opinion. I wouldn't say I am -1, > just -0 for the Optionals in private methods. I am ok with not > forbidding them there. I just think in all cases there is a better > solution than passing the Optionals around, even in private methods. I > just hope the outcome of the discussion won't be that it is no longer > allowed to suggest those during review. > > Best, > > Dawid > > On 19/08/2019 17:53, Andrey Zagrebin wrote: > > Hi all, > > > > Sorry for not getting back to this discussion for some time. > > It looks like in general we agree on the initially suggested points: > > > > - Always use Optional only to return nullable values in the API/public > > methods > > - Only if you can prove that Optional usage would lead to a > > performance degradation in critical code then return nullable value > > directly and annotate it with @Nullable > > - Passing an Optional argument to a method can be allowed if it is > > within a private helper method and simplifies the code > > - Optional should not be used for class fields > > > > The first point can be also elaborated by explicitly forbiding > > Optional/Nullable parameters in public methods. > > In general we can always avoid Optional parameters by either overloading > > the method or using a pojo with a builder to pass a set of parameters. > > > > The third point does not prevent from using @Nullable/@Nonnull for class > > fields. > > If we agree to not use Optional for fields then not sure I see any use > case > > for SerializableOptional (please comment on that if you have more > details). > > > > @Jingsong Lee > > Using Optional in Maps. > > I can see this as a possible use case. > > I would leave this decision to the developer/reviewer to reason about it > > and keep the scope of this discussion to the variables/parameters as it > > seems to be the biggest point of friction atm. > > > > Finally, I see a split regarding the second point: <Passing an Optional > > argument to a method can be allowed if it is within a private helper > method > > and simplifies the code>. > > There are people who have a strong opinion against allowing it. > > Let's vote then for whether to allow it or not. > > So far as I see we have the following votes (correct me if wrong and add > > more if you want): > > Piotr +1 > > Biao +1 > > Timo -1 > > Yu -1 > > Aljoscha -1 > > Till +1 > > Igal +1 > > Dawid -1 > > Me +1 > > > > So far: +5 / -4 (Optional arguments in private methods) > > > > Best, > > Andrey > > > > > > On Tue, Aug 6, 2019 at 8:53 AM Piotr Nowojski <pi...@ververica.com> > wrote: > > > >> Hi Qi, > >> > >>> 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? > >> > >> When I was introducing it there, I have micro-benchmarked this change, > and > >> there was no visible throughput change in a pure network only micro > >> benchmark (with whole Flink running around it any changes would be even > >> less visible). > >> > >> Piotrek > >> > >>> On 5 Aug 2019, at 15:20, Till Rohrmann <trohrm...@apache.org> wrote: > >>> > >>> 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 > >>>>>> > >>>>>> > >>>> > >> > >