Most references are never modified, and accidentally modifying a reference is a potential source of bugs.
One option for avoiding accidental modification is to annotate all variables
that are not modified as final. However that approach is very noisy, since
most variables are never modified, and accidental modification is only avoided
if you remember to add final everywhere.
A better solution is to invert the default, and assume that all variables are
constant unless they are explicitly declared as modifiable. The @Var
annotation provides a way to mark variables as modifiable. The accompanying
Error Prone check enforces that all modifiable parameters and local variables
are explicitly annotated with @Var.
Since Java 8 can infer whether a local variable or parameter is effectively
final, and @Var makes it clear whether any variable is non-final,
explicitly marking local variables and parameters as final is discouraged.
The annotation can also be applied to fields to indicate that the field is
deliberately non-final, but the use of @Var on fields is not required.
Suppress false positives by adding the suppression annotation @SuppressWarnings("Var") to the enclosing element.