Using the final keyword in interface method parameters does nothing
April 02, 2014 [Java, Programming, Programming Languages, Tech]Consider the following Java code:
class FinalInInterface { private static interface WithFinal { public void run( final int x ); } private static class WithoutFinal implements WithFinal { public void run( int x ) { x = 4; System.out.println( x ); } } public static void main( String[] args ) { new WithoutFinal().run( 3 ); } }
This code compiles, and when it runs, it prints "4".
So adding "final" to the x parameter of the run() method in the interface WithFinal has no effect - the implementor of this interface, WithoutFinal is allowed to declare its own run() method without "final", and modify x as much as they want.
This makes more sense if you realise that in Java every method argument is passed by value. When you pass an object reference, the method and the calling code are talking about the same object, but the reference is passed by value, so if you reassign it inside the method, the original object is unaffected, and the reference to it in the calling code is also unaffected. The semantics are basically identical to passing a pointer in C or C++ - the pointer is copied, but the pointed-to object is the same.
If you declare method parameters final in your interface, people implementing that interface don't need to declare them final, and can modify them in their implementations. It's possible that by declaring them final you are trying to communicate to implementors of the interface that they should also declare them final, but as the designer of the interface, it's really none of your business how the implementor implements it.
There is no "const" in Java, so you have no way of preventing the implementor of your interface from modifying an object that is passed in (by copying a reference to it).
If that makes you sad, join the club.