I agree with Udo.  Also, this shouldn't be a VOTE without discussion and I 
don't see a DISCUSS thread.

On 4/14/21, 7:46 PM, "Udo Kohlmeyer" <u...@vmware.com> wrote:

    "+1" to ENCOURAGING developers to make "final" a requirement for method 
arguments.
    "-1" to making it a hard rule.

    If we want to enforce this rule on the basis of readability or performance, 
I fear that we might be beating the wrong horse here for the wrong reasons!! 

    Short reasoning:

    If we really want to effect real lasting change, is to adopt principles 
that Rust (object owners) and Kotlin (immutable collections) make core to the 
language. Immutable POJOs and possibly an extension for collections to make 
intent of immutability clear would be far more effective. As code reviewers 
would be able to look at a method definition and instantly know what arguments 
are mutable.

    Adding "final" on fields, methods and classes has a far greater effect than 
that of method arguments. If we intent to enforce it based on readability, then 
we should really consider applying different approaches (as stated in the 
paragraph above) that can be used with far greater effectiveness.

    Longer reasoning:

    I think all arguments relating to "indicating authors intent" or "variable  
does not change" are great, but in reality we as developers should always 
assume that this was the intent. I think if we really want to improve our code 
base, let's opt for IMMUTABLE data objects. The "final" keyword has no benefit 
if you pass around POJOs (including Collections). As long as you don't change 
the instance reference, the "final" keyword has absolutely no effect. It does 
not mean that you cannot change every field internal of the POJO. The "final" 
keyword is only effective against the re-assignment of that variable/argument 
within a method. But a better practice is to avoid the re-assignment of any 
variable/argument in the first place.

    Kotlin has a great language (one of many) that method/function arguments 
are naturally final and this behavior cannot be changed. In addition there is a 
the feature that the collections are immutable and as a developer you have to 
be explicit if you want a collection to be mutable, by defining the collection 
as a "Mutable*" i.e MutableMap, MutableSet, MutableList 

    @Jake the idea of smaller methods is great and we should ALWAYS strive for 
that. But that argument is completely irrelevant in this discussion. As making 
method arguments final does not naturally guide a developer to creating smaller 
methods. Nor does a smaller method mean it can/will be jitted. Too many factors 
(to discuss here) are part of that decision, also it is not relevant in this 
discussion. But more on that topic read THIS.

    --Udo

    On 4/15/21, 9:29 AM, "Jacob Barrett" <jabarr...@vmware.com> wrote:

        If a method is longer than a handful of lines and I go in to refactor 
it I am going to start by making every variable I find final. Then I am going 
to figure out how to keep them final. By doing so you naturally produce smaller 
functional methods that are usually independently unit testable. Smaller 
methods can get jitted. Smaller methods can take less time to reach a safe 
point (see time to safe point issues in Java). 

        For this reason I strongly prefer on final everywhere and if you think 
you need a variable to not be final you should use that as an indicator to 
refractor your code. 

        So, +1 for me for final everywhere. 

        Also, please stop declaring variables miles away from their use.

        > On Apr 14, 2021, at 12:55 PM, Kirk Lund <kl...@apache.org> wrote:
        > 
        > Our coding standard and our Design Decisions does NOT require using 
final
        > on parameters and local variables.
        > 
        > Please do NOT request that I add or keep final on parameters or local
        > variables unless the community votes and decides that every parameter 
and
        > local variable should require the final keyword. I coded this way in 
the
        > past and I found that it resulted in noisy code with no benefit. We 
can
        > argue about using this keyword all you want but the fact is I'm 
against it,
        > and I will not embrace it unless this community decides that we need 
to use
        > it.
        > 
        > Using final on instance or class fields does have a concurrency 
benefit and
        > I support that only.
        > 
        > If you want to add final to every single parameter and local var in 
the
        > Geode codebase, then now is your chance to vote on it. Please vote.
        > 
        > Thanks,
        > Kirk



Reply via email to