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