Sorry Bruce, that's my lack of Apache finesse. I know you might expect me to remember it but I don't start discussions or votes often enough to remember. I'll be sure to read up on this process before starting any threads in the future.
On Thu, Apr 15, 2021 at 7:32 AM Bruce Schuchardt <bru...@vmware.com> wrote: > 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 > > > >