Variable versus Read-Only

This page has been renamed to Variables versus Values.

Please update your bookmarks, and wiki pages which link here


From Comparing Programming Languages.

There are three different places you find "variables" : class fields, local variables and function arguments.

In Java a "variable" can be final, which prevents it being re-assigned. C# uses the same semantics but uses the readonly keyword. Kotlin is different, it has two keywords var meaning it can be re-assigned and val meaning it can't.

I really like the Kotlin style. In fact I'd go so far as saying that Java and C# are quite simply wrong!

If I review my old Java code, there is no information that tells me if the final keyword was omitted on purpose, or through lack of thought. What's worse, once I have reviewed all of my code, there is still no information that tells me that each "variable" has been considered.

I think names matter, if you use the wrong name, you will tend to think incorrectly. C# uses the keyword readonly, and IMHO, this is wrong. You can define a List to be readonly, but that only means it cannot be re-assigned to a different List. This List is still mutable. Neither Java's final nor Kotlin's var / val keywords are misleading.

If you are keeping score : Kotlin 2, Java 1, C# zero ;-)

Kotlin has taken a more radical approach to function arguments - they are never re-assignable. I'm undecided if I approve of this. Time will tell.