Please elaborate on you preference regarding Objects.requireNonNull()? As currently there are only a few instances of requireNonNull() calls in Drill, why not to fix it now and avoid inconsistency in the future?
Thank you, Vlad > On Aug 22, 2018, at 03:02, Arina Yelchiyeva <arina.yelchiy...@gmail.com> > wrote: > > I don't feel like banning Objects.checkNotNull() right now though even > Guava suggests not using this method. I suggest we leave it as is in the > scope of current PR#1397 (revert replacements where they were done) and > discuss further approach on how we should treat checks at runtime. > > Kind regards, > Arina > > On Wed, Aug 22, 2018 at 5:32 AM Vlad Rozov <vro...@apache.org > <mailto:vro...@apache.org>> wrote: > >> My comments inline. >> >> Thank you, >> >> Vlad >> >> >>> On Aug 21, 2018, at 17:05, Paul Rogers <par0...@yahoo.com.INVALID> >> wrote: >>> >>> Hi All, >>> >>> My two cents... >>> >>> The gist of the discussion is that 1) using Objects.checkNotNull() >> reduces the Guava import footprint, vs. 2) we are not removing the Guava >> dependency, so switching to Objects.checkNotNull() is unnecessary >> technically and is instead a personal preference. >> >> The gist of the discussion in the PR and on the mailing list is whether or >> not to use a functionality(methods) provided by a library (in this case >> Guava) that is(are) also available in JDK or it(they) needs to be >> pro-actively replaced by the functionality(methods) provided by the JDK. My >> take is that it will be justified only in case the entire dependency on the >> library can be eliminated or when the library author deprecated the >> functionality(methods) in use. It is not the case for Guava library and >> Preconditions class it provides. >> >> Guava explicitly recommends to avoid using Objects.checkNotNull() method, >> so I suggested to prohibit it’s usage as a personal preference. >> >>> >>> We make heavy use of the unique Guava "loading cache". We also use other >> Guava preconditions not available in Objects. So deprecation of Guava is >> unlikely anytime soon. (Though, doing so would be a GOOD THING, that >> library causes no end of grief when importing other libraries due to >> Guava's habit of removing features.) >> >> There is a separate PR that takes care of the “grief when importing other >> libraries" that also depend on Guava caused by “Guava’s habit of removing >> features”. Additionally, Guava is mostly source compatible across version >> since version 21.0 (see >> https://github.com/google/guava/blob/master/README.md < >> https://github.com/google/guava/blob/master/README.md >> <https://github.com/google/guava/blob/master/README.md>>), so I highly >> doubt that dependency on Guava will ever go away. >> >>> >>> Given that Guava is not going away, I tend to agree with the suggestion >> there is no need to do the null check replacement now. It can always be >> done later if/when needed. >>> >>> If we were to want to make the change, I'd suggest we debate >> preconditions vs. assert. Drill is now stable, I can't recall a time when I >> ever saw a precondition failure in a log file. But, users pay the runtime >> cost to execute them zillions of times. At this level of maturity, I'd >> suggest we use asserts, which are ignored by the runtime in "non-debug" >> runs, but which will still catch failures when we run tests. >> >> Actually, asserts are *not* ignored by the runtime in “non-debug” runs, >> they may be optimized away by the hotspot compiler. Additionally, I will be >> really surprised to see that replacing preconditions with assert will save >> more time in all customer runs compared to how long it will take to discuss >> the change, make and merge it. >> >>> >>> Yes, we could argue that the JVM will optimize away the call. But, we do >> have code like this, which can't be optimized away: >>> >>> >>> Preconditions.checkArgument(numSlots <= regionsToScan.size(), >>> >>> String.format("Incoming endpoints %d is greater than number of >> scan regions %d", numSlots, regionsToScan.size())); >> >> This is a bad example of using Preconditions. It needs to be changed to >> >> Preconditions.checkArgument(numSlots <= regionsToScan.size(), >> "Incoming endpoints %s is greater than number of scan regions %s”, >> numSlots, regionsToScan.size()); >> >> that will be inlined by the hotspot compiler. >> >>> >>> >>> So, my suggestion: leave preconditions for now. At some point, open the >> assertions vs. preconditions debate. >>> >>> Thanks, >>> - Paul >>> >>> >>> >>> On Tuesday, August 21, 2018, 1:46:10 PM PDT, Vlad Rozov < >> vro...@apache.org> wrote: >>> >>> I am -1 on the first proposal, -0 on the second and +1 for using >> Preconditions.checkNotNull() with Objects.requireNonNull() be banned. >> Please see [1], [2] (quoted) and [3]: >>> >>>> Projects which use com.google.common should generally avoid the use of >> Objects.requireNonNull(Object) < >> https://docs.oracle.com/javase/9/docs/api/java/util/Objects.html?is-external=true#requireNonNull-T->. >> Instead, use whichever of checkNotNull(Object) < >> https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/base/Preconditions.html#checkNotNull-T-> >> or Verify.verifyNotNull(Object) < >> https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/base/Verify.html#verifyNotNull-T-> >> is appropriate to the situation. (The same goes for the message-accepting >> overloads.) >>> >>> Thank you, >>> >>> Vlad >>> >>> [1] >> https://stackoverflow.com/questions/34646554/java-util-objects-requirenonnull-vs-preconditions-checknotnull >> < >> https://stackoverflow.com/questions/34646554/java-util-objects-requirenonnull-vs-preconditions-checknotnull >>> >>> [2] >> https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/base/Preconditions.html >> < >> https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/base/Preconditions.html >>> >>> [3] https://github.com/google/guava/wiki/PreconditionsExplained < >> https://github.com/google/guava/wiki/PreconditionsExplained> (the last >> paragraph) >>> >>>> On Aug 21, 2018, at 11:50, Vova Vysotskyi <vvo...@gmail.com> wrote: >>>> >>>> Hi all, >>>> >>>> I'm working on the PR-1397 <https://github.com/apache/drill/pull/1397> >>>> for DRILL-6633, which aims to replace usage of Guava classes by JDK ones >>>> where possible. >>>> >>>> One of the things I have done was replacing >> Preconditions.checkNotNull() by >>>> Objects.requireNonNull(). >>>> >>>> I have a discussion in this PR with Vlad Rozov about the replacement >>>> mentioned above (see our arguments in these comments >>>> <https://github.com/apache/drill/pull/1397#discussion_r207266884>). >>>> >>>> So I'm wondering the opinion of the community regarding the way which >>>> should be chosen for further development: >>>> - Should all usages of Preconditions.checkNotNull() be replaced by >>>> Objects.requireNonNull() and Preconditions.checkNotNull() banned? >>>> - Should be left Preconditions.checkNotNull() and allowed usage of both >>>> Preconditions.checkNotNull() and Objects.requireNonNull(). >>>> >>>> Kind regards, >>>> Volodymyr Vysotskyi