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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to