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