docs: @CheckForNull
    public String getString(String key) {
      String effectiveKey = definitions.validKey(key);
      Optional<String> value = getRawString(effectiveKey);
      if (!value.isPresent()) {
        // default values cannot be encrypted, so return value as-is.
        return getDefaultValue(effectiveKey);
      }
      if (encryption.isEncrypted(value.get())) {
        try {
          return encryption.decrypt(value.get());
        } catch (Exception e) {
          throw new IllegalStateException("Fail to decrypt the property " + effectiveKey + ". Please check your secret key.", e);
        }
      }
      return value.get();
    }