Hi All, It looks like we have reached a consensus regarding the last left question.
I suggest the following final summary: - Use @Nullable annotation where you do not use Optional for the nullable values - If you can prove that Optional usage would lead to a performance degradation in critical code then fallback to @Nullable - Always use Optional to return nullable values in the API/public methods except the case of a proven performance concern - Do not use Optional as a function argument, instead either overload the method or use the Builder pattern for the set of function arguments - Note: an Optional argument can be allowed in a *private* helper method if you believe that it simplifies the code, example is in [1] - Do not use Optional for class fields If there are no more comments/concerns/objections I will open a PR to reflect this in the code style guide. Bets, Andrey [1] https://github.com/apache/flink/blob/master/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroFactory.java#L95 On Tue, Aug 20, 2019 at 10:35 AM Yu Li <car...@gmail.com> wrote: > Thanks for the summarize Andrey! > > I'd also like to adjust my -1 to +0 on using Optional as parameter for > private methods due to the existence of the very first rule - "Avoid using > Optional in any performance critical code". I'd regard the "possible GC > burden while using Optional as parameter" also one performance related > factor. > > And besides the code convention itself, I believe it's even more important > to make us contributors know the reason behind. > > Thanks. > > Best Regards, > Yu > > > On Tue, 20 Aug 2019 at 10:14, Stephan Ewen <se...@apache.org> wrote: > > > 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 > > > >>>>>> > > > >>>>>> > > > >>>> > > > >> > > > > > > > > >