I like to use final on passed-in parameters, but not always. The reason I find it valuable is for those rare situations, where I want to make a point to whoever is looking at the implementation of the method that a particular parameter is subject to mutability due to the way the method is implemented. Just a little hint to help make sense of the code.
Alexey 2001 Honda CBR600F4i (CCS) 1992 Kawasaki EX500 http://azinger.blogspot.com http://bsheet.sourceforge.net http://wcollage.sourceforge.net --- On Fri, 2/13/09, Casper Bang <[email protected]> wrote: > From: Casper Bang <[email protected]> > Subject: [The Java Posse] Re: 'final' mandatory on parameters? > To: "The Java Posse" <[email protected]> > Date: Friday, February 13, 2009, 1:59 PM > I like final on parameters as well as local variables (a > final > parameter is just a local variable pushed from a lower > stack frame). > While realizing it is no guarantee for immutability, it > helps me > feeling more in control of the exposed state space, > remember to add > pre-conditions and generally yields betterâ„¢ code. A Java > anno 2009 > would surely use opt-in non-final semantics no? > > Happy weekend > /Casper > > > On 13 Feb., 19:09, Reinier Zwitserloot > <[email protected]> wrote: > > This is a spin-off from the 'code reviews' > thread (http:// > > > groups.google.com/group/javaposse/browse_thread/thread/ > > 827d3257c903e9bd/35db9fd36906dd5d#35db9fd36906dd5d ) > > > > Robert Fischer isn't the first soul I've heard > mention that they > > either enforce setting all parameters to > 'final', or, because that > > created ginormous method signatures, configure their > IDE to warn/error > > when parameters are modified. > > > > I wonder if this really is a good idea. > > > > The usual arguments come in three flavours, at least > as far as I've > > heard them: > > > > 1. The confusion argument: java is strictly > pass-by-value so > > someParameter = x; does NOT change the meaning of > 'someParameter' in > > the code that called your method. By disallowing > assignment you avoid > > the confusion (This is Robert's argument). > > > > 2. The overlook argument: As methods grow larger (or > even if they > > remain small and you're just glancing) you may > miss a re-assignment to > > a parameter, and as you add some code onto the end of > a method, for > > example to fix a bug, you erroneously think the value > has been > > untouched. Proponents of this argument also usually > enforce that > > 'return' must be the last statement, under the > presumption that a mid- > > method return may let people think that the code they > just added to > > the end is always run before the method returns > normally. > > > > 3. The save-the-value argument: You never know when > you need to > > original value that was passed in, so changing it may > require > > refactors down the line. > > > > They all seem like bullpucky to me though. > Point-by-point > > deconstruction: > > > > 1. If you're going to make rules because your > fellow programmers don't > > know their arse from their teakettles, you'll > never get anything done. > > Sure, for extremely obscure stuff I can see some value > in setting up > > style checkers and the like to disallow certain > operations, but > > something as simple as pass-by-value? Also, even if > you really do have > > such mythically stupid programmers, you can still > catch them in their > > error: Anybody that changes any local variable or > parameter and then > > never touches it again is clearly doing SOMETHING > wrong (that > > assignment was a no-op!), and if someone makes the > mistake of thinking > > that java is pass-by-reference, they'll hit that > sooner rather than > > later. javac doesn't check for this, but findbugs > does. In fact, I > > think that most methods that would only work if java > is pass-by-ref > > will make this mistake. > > > > 2. You can't just shove code into a method without > understanding the > > method first. For example, I've seen lots of > methods that take their > > incoming parameter, and then perform a normalization > on it; for > > example, an incoming string gets a if ( x == null ) x > = ""; treatment > > so future code can treat null and the empty string the > same. Any > > casual method editor probably THINKS they are working > on the > > normalized version. By enforcing the original coder to > come up with a > > second variable to hold the normalized version, > you're actually > > creating the very situation you tried to avoid! > > > > 3. ... then why don't you refactor it? We have > refactor tools for a > > reason. > > > > I have a soft (meaning: feel free to break it if you > have a decent > > reason to do so) rule regarding changing your method > parameters: > > > > Make all changes to all parameters before the real > meat of the method > > begins. Then, consider them final. (In other words, if > you want to > > replace a parameter being 'null' with a > default, or expand an input > > with a prefix, or any other normalization, do so at > the very top of > > the method, then never change it again). > > > > Unfortunately there's no tool out there that has a > rule to check if > > you adhere to it. > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "The Java Posse" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/javaposse?hl=en -~----------~----~----~----~------~----~------~--~---
