After checking out the check style modules mentioned by Tison, I really do not see a point of enforcing/adding `final`. With ParameterAssignment [1] it’s redundant and will cause problems that I mentioned before.
Additionally enabling ParameterAssignment [1] would be probably much easier in our code base compared to enabling FinalParameters [2]. However still I’m not sure if that’s worth our troubles. I would be in favour of doing it only If enabling ParameterAssignment [1] doesn’t require many changes in our code base. Piotrek [1] https://checkstyle.sourceforge.io/config_coding.html#ParameterAssignment <https://checkstyle.sourceforge.io/config_coding.html#ParameterAssignment> [2] https://checkstyle.sourceforge.io/config_misc.html#FinalParameters <https://checkstyle.sourceforge.io/config_misc.html#FinalParameters> > On 7 Oct 2019, at 11:09, Dawid Wysakowicz <dwysakow...@apache.org> wrote: > > Hi all, > > My quick take on it. > > 1. If I were to introduce any rule on that I agree with Aljoscha, we > should rather enforce the `final` keyword rather than the opposite. > > 2. I think it does not make sense to enforce rules on such an > unimportant (in my opinion) topic. Generally I agree with Piotr that if > we want to introduce some rule we should have a way to automatically > enforce it. > > 3. I also agree with Piotr that problems with parameters reassignment > appear nearly exclusively in a very long methods. If we break long > methods in a shorter ones than there is usually no problem with a > parameter reassignment. > > 4. I would be ok with adding a point to our code style guidelines, but > honestly I am a bit skeptical. In the end we are not writing a book on > how to write a good software, but we rather list the most important > problems that we've seen so far in Flink code base and how to better > solve it. I'm not sure that's the case with the parameters reassignment. > > Best, > > Dawid > > On 07/10/2019 10:11, Zili Chen wrote: >> Thanks for your thoughts Arvid & Piotr, >> >> I check out the effect of ParameterAssignment[1] and it does >> prevent codes from modifying parameter which I argued above >> the most value introduced by `final` modifier of parameter. >> >> So firstly, I think it's good to enable ParameterAssignment in our >> codebase. >> >> Besides, there is no rule to forbid `final` modifier of parameter. >> Instead, there is a rule to enforce `final` modifier[2] but given [1] >> enabled it is actually redundant. >> >> The main purpose for, given enforced not modify parameters, reducing >> `final` modifiers of parameter is to remove redundant modifier so that we >> don't see have declaration like >> >> T fn( >> final ArgumentType1 argument1, >> final ArgumentType2 argument2, >> ...) >> >> because we actually don't mark final everywhere so it might make some >> confusions. >> >> Given [1] is enforced these `final` are indeed redundant so that we can >> add a convention to reduce `final` modifiers of parameters, which is a net >> win. >> >> Best, >> tison. >> >> [1] https://checkstyle.sourceforge.io/config_coding.html#ParameterAssignment >> [2] https://checkstyle.sourceforge.io/config_misc.html#FinalParameters >> >> >> >> Piotr Nowojski <pi...@ververica.com> 于2019年10月7日周一 下午3:49写道: >> >>> Hi, >>> >>> Couple of arguments to counter the proposal of making the `final` keyword >>> obligatory. Can we prepare a code style/IDE settings to add it >>> automatically? If not, I would be strongly against it, since: >>> >>> - Intellij’s automatic refactor actions will not work properly. >>> - I don’t think it’s a big deal. I don’t remember having any issues with >>> the lack or presence of the `final` keyword. >>> - `final` is pretty much useless in most of the cases (it’s not `const` >>> and it works only for the primitive types). >>> - I don’t like the extra overhead of doing something of very little extra >>> value. Especially the extra hassle of going back & forth during the reviews >>> (both as a contributor & as a reviewer). >>> - If missing `final` keyword caused some confusion, because surprisingly a >>> parameter was modified somewhere in the function and it wasn’t obviously >>> visible, the function is doing probably too many things and it’s too >>> long/too complicated… >>> >>> Generally speaking, I’m against adding minor things to our codestyle that >>> can not be enforced and added automatically. >>> >>> Piotrek >>> >>>> On 7 Oct 2019, at 09:13, Arvid Heise <ar...@ververica.com> wrote: >>>> >>>> Hi guys, >>>> >>>> I'm a bit torn. In general, +1 for making parameters effectively final. >>>> >>>> The question is how to enforce it. We can make it explicit (like Aljoscha >>>> said). All IDEs will show immediately warnings/errors for violations. It >>>> would allow to softly migrate code. >>>> >>>> Another option is to use a checkstyle rule [1]. Then, we could omit the >>>> final keyword and rely on checkstyle checks as we do for quite a few >>> other >>>> things. A hard checkstyle rule would probably fail on a good portion of >>> the >>>> current code base. But we would also remove reassignment to parameters >>>> (which I consider an anti-pattern). >>>> >>>> If we opt not to enforce it, then -1 for removing final keywords from my >>>> side. >>>> >>>> Best, >>>> >>>> Arvid >>>> >>>> [1] >>>> >>> https://checkstyle.sourceforge.io/apidocs/com/puppycrawl/tools/checkstyle/checks/coding/ParameterAssignmentCheck.html >>>> On Fri, Oct 4, 2019 at 1:22 PM Zili Chen <wander4...@gmail.com> wrote: >>>> >>>>> Hi Aljoscha, >>>>> >>>>> I totally agree with you on field topic. Of course it makes significant >>>>> difference whether >>>>> or not a field is final and IDE/compiler can help on checking. >>>>> >>>>> Here are several thoughts about final modifier on parameters and why I >>>>> propose this one: >>>>> >>>>> 1. parameters should be always final >>>>> >>>>> As described above, there is no reason a parameter to be non-final. So >>>>> different with field, >>>>> a field can be final or non-final based on whether or not it is >>> immutable. >>>>> Thus with such a >>>>> code style guide in our community, we can work towards a codebase every >>>>> parameter is >>>>> effectively final. >>>>> >>>>> 2. parameter final cannot be inherited >>>>> >>>>> Unfortunately Java doesn't keep final modifier of method parameter when >>>>> inheritance. So >>>>> even you mark a parameter as final in an interface or super class, you >>> have >>>>> to re-mark it >>>>> as final in its implementation or subclass. From another perspective, >>> final >>>>> modifier of >>>>> parameter is a local attribute of parameter so that we can narrow >>> possible >>>>> effect during >>>>> review. >>>>> >>>>> 3. IDE can lint difference between effective final and mutable parameter >>>>> >>>>> It is true that IDE such as Intellij IDEA can lint difference between >>>>> effective final and >>>>> mutable parameter(with underline). So that with this code style what we >>>>> lose is that >>>>> we cannot get a compile time error if someone modifies parameter in the >>>>> method body. >>>>> But as mentioned in 1, by no means we allow a parameter to be modified. >>> If >>>>> we agree >>>>> on this statement, then we hopefully converge in a codebase that no >>>>> parameter is >>>>> modified. >>>>> >>>>> For what we gain, I'd like to recur our existing code style of @Nonnull >>> to >>>>> be default. >>>>> Actually it does help for compiler to report compile time warning if we >>>>> possibly pass a >>>>> nullable value to an non-null field. We make @Nonnull as default to >>> "reduce >>>>> code noise" >>>>> so I think we can reuse the statement here also. >>>>> >>>>> Best, >>>>> tison. >>>>> >>>>> >>>>> Aljoscha Krettek <aljos...@apache.org> 于2019年10月4日周五 下午5:58写道: >>>>> >>>>>> I actually think that doing this the other way round would be correct. >>>>>> Removing final everywhere and relying on humans to assume that >>> everything >>>>>> is final doesn’t seem maintainable to me. The benefit of having final >>> on >>>>>> parameters/fields is that the compiler/IDE actually checks that you >>> don’t >>>>>> modify it. >>>>>> >>>>>> In general, I think that as much as possible should be declared final, >>>>>> including fields and parameters. >>>>>> >>>>>> Best, >>>>>> Aljoscha >>>>>> >>>>>>> On 2. Oct 2019, at 13:31, Piotr Nowojski <pi...@ververica.com> wrote: >>>>>>> >>>>>>> +1 from my side. >>>>>>> >>>>>>>> On 2 Oct 2019, at 13:07, Zili Chen <wander4...@gmail.com> wrote: >>>>>>>> >>>>>>>> Yes exactly. >>>>>>>> >>>>>>>> >>>>>>>> Piotr Nowojski <pi...@ververica.com> 于2019年10月2日周三 下午7:03写道: >>>>>>>> >>>>>>>>> Hi Tison, >>>>>>>>> >>>>>>>>> To clarify your proposal. You are proposing to actually drop >>> the >>>>>>>>> `final` keyword from the parameters and we should implicilty assume >>>>>> that >>>>>>>>> it’s always there (in other words, we shouldn’t be modifying the >>>>>>>>> parameters). Did I understand this correctly? >>>>>>>>> >>>>>>>>> Piotrek >>>>>>>>> >>>>>>>>>> On 1 Oct 2019, at 21:44, Zili Chen <wander4...@gmail.com> wrote: >>>>>>>>>> >>>>>>>>>> Hi devs, >>>>>>>>>> >>>>>>>>>> Coming from this discussion[1] I'd like to propose that in Flink >>>>>> codebase >>>>>>>>>> we suggest a code style >>>>>>>>>> that parameters of method are always final. Almost everywhere >>>>>> parameters >>>>>>>>> of >>>>>>>>>> method are final >>>>>>>>>> already and if we have such consensus we can prevent redundant >>> final >>>>>>>>>> modifier in method >>>>>>>>>> declaration so that we survive from those noise. >>>>>>>>>> >>>>>>>>>> Here are some cases that might require to modify a parameter. >>>>>>>>>> >>>>>>>>>> 1. to set default; especially if (param == null) { param = ... } >>>>>>>>>> 2. to refine parameter; it is in pattern if ( ... ) { param = >>>>>>>>>> refine(param); } >>>>>>>>>> >>>>>>>>>> Either of the cases we can move the refine/set default logics to >>> the >>>>>>>>> caller >>>>>>>>>> or select another >>>>>>>>>> name for the refined value case by case. >>>>>>>>>> >>>>>>>>>> Looking forward to your feedbacks :-) >>>>>>>>>> >>>>>>>>>> Best, >>>>>>>>>> tison. >>>>>>>>>> >>>>>>>>>> [1] >>> https://github.com/apache/flink/pull/9788#discussion_r329314681 >>>>>>>>> >>>>>> >>> >