Por que o objeto final pode ser modificado?

Me deparei com o seguinte código em uma base de código em que estou trabalhando:

public final class ConfigurationService {
    private static final ConfigurationService INSTANCE = new ConfigurationService();
    private List providers;

    private ConfigurationService() {
        providers = new ArrayList();
    }

    public, static void addProvider(ConfigurationProvider provider) {
        INSTANCE.providers.add(provider);
    }

    ...

INSTANCE é declarado comofinal. Por que os objetos podem ser adicionados aINSTANCE? Isso não deve invalidar o uso de final. (Não).

Presumo que a resposta tenha algo a ver com ponteiros e memória, mas gostaria de ter certeza.

questionAnswers(7)

yourAnswerToTheQuestion