Casper Bang wrote:
> 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?
>   
I don't understand the argument. Java is pass by value so the value on 
the stack can't be changed and that is all final would protect anyways.

Regards,
Kirk
> 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to