You shouldn't declare a variable final
if you wish to modify its value at a later date. In the case of collections, if you are planning on replacing the entire reference to the collection, then it's fine to not mark it as final
.
// Plan to change collection
List<Integer> intVals = new ArrayList<>();
// later in your code
intVals = getOtherValuesInstead();
You should declare it final
if you absolutely do not want the reference to change. This is the more typical approach; as you describe correctly, since you can add values to the collection anyway, you shouldn't find yourself in a scenario where you have to change its reference.