¿Por qué se puede modificar el objeto final?

Encontré el siguiente código en una base de código en la que estoy trabajando:

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 se declara comofinal. ¿Por qué se pueden agregar objetos aINSTANCE? ¿No debería eso invalidar el uso de final? (No lo hace)

Supongo que la respuesta tiene que ver con los punteros y la memoria, pero me gustaría saberlo con certeza.

Respuestas a la pregunta(7)

Su respuesta a la pregunta