I agree with Murtuza, most finals on local variables and method parameters are just noise to me. I only use "final" on these two situations: 1. to declare public static constants of immutable types (e.g. String, Integer) 2. to prevent children from overriding a method.
But thought I can't offer an example, I don't want to put out a blank statement saying that "final" on local variables are entirely unnecessary. There must be a case that it could be useful, so even if we come to a consensus that local variables should not have final on it, I don't think using a static analysis tool to get rid of all of them is a good idea. On Tue, Jun 18, 2019 at 11:14 AM Anthony Baker <aba...@pivotal.io> wrote: > I’ll offer this alternative: perhaps shorter method bodies obviate the > need for explicit final vars. > > Anthony > > > > On Jun 18, 2019, at 10:30 AM, Ernest Burghardt <eburgha...@pivotal.io> > wrote: > > > > +1 to auto-enforcement (if possible) post-consensus > > > > On Tue, Jun 18, 2019 at 8:33 AM Murtuza Boxwala <mboxw...@pivotal.io> > wrote: > > > >> final in Java does not guarantee immutability. It would be AWESOME if > it > >> did but all it guarantees is that the variable cannot be reassigned. In > >> most cases the variable points to an object’s location (memory > address), so > >> you can still call methods on it, e.g. > >> > >> final var = new Foo(); > >> var.mutateState(); > >> > >> final variables like these are in no way thread safe. To make objects > >> immutable, the objects themselves need to follow a pattern that > guarantees > >> that. Something like the ValueObject < > >> https://martinfowler.com/bliki/ValueObject.html> pattern. > >> > >> Mutability may well be the enemy, but I don’t think this is the > construct > >> that gets us much/if any closer. > >> > >> In local variables and parameters final feels like noise to me, and in > >> fact may make things more difficult to reason about, if we start > assuming > >> variables with final are thread safe. > >> > >> But I may be missing something. I am more curious to see how we come to > >> consensus on something like this, because the worst outcome from all > this > >> will be to have some folks actively adding final and some actively > removing > >> it, which will add noise to PRs and to the code. And once we reach > >> consensus, how do we enforce somethings like this? ./gradlew spA? > >> > >>> On Jun 17, 2019, at 8:55 PM, Jacob Barrett <jbarr...@pivotal.io> > wrote: > >>> > >>> I too am in camp final too. You could say `final boolean useFinal = > >> true`. For all the same reasons Bill stated below. > >>> > >>>> On Jun 17, 2019, at 5:33 PM, Bill Burcham <bburc...@pivotal.io> > wrote: > >>>> > >>>> The final keyword is not redundant—quite the opposite—it's extremely > >> valuable. > >>>> > >>>> Local variables are not, in general, final, unless you declare them as > >> such. That being the case, it is not redundant to declare local > variables > >> "final". > >>>> > >>>> What the compiler will do for you, is _if_ it can ensure that a local > >> variable (or method parameter) is never modified (after initialization) > >> then that variable is treated as "effectively final". Variables that are > >> explicitly declared final, or are determined to be "effectively final" > may > >> be referenced in lambdas. That's a nice thing. > >>>> > >>>> I would like to offer a counter-recommendation: final should be the > >> default everywhere for fields, for method parameters (on classes, not on > >> interfaces), and for local variables. > >>>> > >>>> Many benefits would accrue to us, should we adopt this default: > >>>> > >>>> 1. final fields must be initialized in a constructor and never mutated > >> again. This makes reasoning about those fields easier. > >>>> 2. classes that have all their fields final are immutable and hence > >> easier to reason about: they can be passed between threads, for > instance, > >> with no need to protect from races > >>>> 3. final method parameters can never be mutated, making them easier to > >> reason about > >>>> 4. final local variables can never be mutated, making them easier to > >> reason about > >>>> > >>>> When final is the rule, non-final is the exception. Another way of > >> saying that is that when final is the rule, mutability is the exception. > >> That is as it should be. Mutability is the enemy. > >>>> > >>>> I have turned on a couple IntelliJ settings that make this the default > >> for me. I encourage you to do the same: > >>>> > >>>> First there are these two "Code style issues" in the Java inspections: > >>>> > >>>> "Field may be 'final'" > >>>> "Local variable or parameter can be final" > >>>> > >>>> > >>>> > >>>> Then there is this setting will cause newly-defined variables created > >> via the "Extract variable" refactoring: > >>>> > >>>> If you select that check box (after selecting those inspections > >> settings above), it'll declare the newly-introduced variable "final" and > >> it'll remember the setting the next time you invoke "Extract variable" > >> refactoring > >>>> > >>>> > >> > >> > > -- Cheers Jinmei