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