public static <T> Builder<T> ofType(final Class<T> clazz) {
            if (!Enum.class.isAssignableFrom(clazz)
                && (!FROM_STRING.containsKey(clazz) || !TO_STRING.containsKey(clazz) || !TO_DISPLAY_STRING.containsKey(clazz))) {
                throw new IllegalArgumentException("Cannot create a SystemProperty of type " + clazz.getName());
            }
            return new Builder<>(clazz);
        }
Start a new SystemProperty builder. The following types of SystemProperty are supported:
<ul>
<li>{@link String}</li>
<li>{@link Integer} - for which a default value must be supplied using {@link #setDefaultValue(Object)}</li>
<li>{@link Long} - for which a default value must be supplied</li>
<li>{@link Double} - for which a default value must be supplied</li>
<li>{@link Boolean} - for which a default value must be supplied</li>
<li>{@link Duration} - for which a {@link ChronoUnit} must be specified, to indicate how the value will be saved, using {@link #setChronoUnit(ChronoUnit)}</li>
<li>{@link Instant}</li>
<li>{@link JID}</li>
<li>{@link Class} - for which a base class must be specified from which values must inherit, using {@link #setBaseClass(Class)}</li>
<li>any {@link Enum} - for which a default value must be supplied</li>
<li>{@link List} - for which a collection type must be specified, using {@link #buildList(Class)}</li>
<li>{@link Set} - for which a collection type must be specified, using {@link #buildSet(Class)}</li>
</ul>

@param <T>   the type of SystemProperty
@param clazz The class of property being built
@return A SystemProperty builder
xmppserver/src/main/java/org/jivesoftware/util/SystemProperty.java