code: public synchronized <S> void registerService(
          Class<S> serviceInterface,
          S implementation
      ) {
  
          if (this.getClass() != StdResourceLoader.class) {
              throw new IllegalStateException("Can only be called on standard resource loader.");
          }
  
          List<Object> list = REGISTERED_SERVICES.get(serviceInterface);
  
          if (list == null) {
              list = new CopyOnWriteArrayList<>();
          }
  
          if (list.contains(implementation)) {
              throw new IllegalStateException("Service already registered: " + implementation);
          }
  
          list.add(implementation);
          REGISTERED_SERVICES.put(serviceInterface, list);
  
      }
docs: /*[deutsch]
  <p>Registriert einen externen <i>Service Provider</i>. </p>
  
  <p>Diese Methode dient haupts&auml;chlich der Registrierung eines extra Zeitzonen-Repositoriums, wenn
  der <i>service loader</i>-Mechanismus im Kontext von OSGi nicht funktioniert. <strong>Wichtig:</strong>
  Der Aufruf dieser Methode mu&szlig; vor der Verwendung von jedem anderen Time4J-Code geschehen.
  Beispiel zur Registrierung des tzdata-Moduls (v3.0 oder sp&auml;ter): </p>
  
  <pre>
  ResourceLoader.getInstance().registerService(
  ZoneModelProvider.class,
  new net.time4j.tz.repo.TimezoneRepositoryProviderSPI());
  </pre>
  
  <p>Hinweis: Das Beispiel kann mit dem Ausdruck {@code net.time4j.tz.repo.TZDATA.init()} abgek&uuml;rzt werden,
  der auch aktuelle Schaltsekundendaten liefert. </p>
  
  @param   <S> generic service type
  @param   serviceInterface    service interface
  @param   implementation      service provider
  @throws  IllegalStateException if already registered or called on a non-standard resource loader like on Android
  @since   5.0