title: Why can final object be modified?
body: <p>I came across the following code in a code base I am working on:</p>
  
  <pre><code>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);
      }
  
      ...
  </code></pre>
  
  <p><code>INSTANCE</code> is declared as <code>final</code>.  Why can objects be added to <code>INSTANCE</code>?  Shouldn't that invalidate the use of final.  (It doesn't).</p>
  
  <p>I'm assuming the answer has to do something with pointers and memory but would like to know for sure.</p>