Variables versus Values

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.