Thanks for summarizing the discussion Andrey, +1 to this style.

Regards,
Timo


Am 21.08.19 um 11:57 schrieb Andrey Zagrebin:
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



Reply via email to