private void initialize() {
        stringValue = toStringValue(major, minor, micro, qualifier);
        ensureUnspecifiedOnlyToTheRight(major, minor, micro, qualifier);

        if (major!=null && major < 0)
            throw new IllegalArgumentException("Negative major in " + this);
        if (minor!=null && minor < 0)
            throw new IllegalArgumentException("Negative minor in " + this);
        if (micro!=null && micro < 0)
            throw new IllegalArgumentException("Negative micro in " + this);

        String q = getQualifier();
        for (int i = 0; i < q.length(); i++) {
            if ( !Character.isLetterOrDigit(q.charAt(i)) )
                throw new IllegalArgumentException("Invalid qualifier in " + this +
                                                   ": Invalid character at position " + i + " in qualifier");
        }
    }
Must be called on construction after the component values are set

@throws IllegalArgumentException If the numerical components are negative
        or the qualifier string is invalid.
component/src/main/java/com/yahoo/component/VersionSpecification.java