+ /**
+ * The constant '31' is the result of folding this code:
+ * <pre>
+ * <code>
+ * final int prime = 31;
+ * int result = 1;
+ * result = result * prime + Objects.hashCode(obj);
+ * return result;
+ * </code>
+ * </pre>
+ * when hashCode is returned as 0, such as due to obj being null or its hashCode being 0.
+ *
+ * @param hash Wrapped object hash
+ * @return Wrapper object hash
+ */
+ private static int wrapHashCode(final int hash) {
+ return hash == 0 ? 31 : hash;
+ }
+
+ /**
+ * Check that the specified {@link Enumeration} object is not {@code null}. This method is meant to be used with
+ * {@code ofName(String)} and {@code ofValue(int)} static factory methods.
+ *
+ * @param obj enumeration object, possibly null
+ * @param name User-supplied enumeration name
+ * @return Enumeration object
+ * @throws IllegalArgumentException if {@code obj} is null
+ */
+ public static <T extends Enumeration> @NonNull T checkEnum(final @Nullable T obj, final String name) {
+ if (obj == null) {
+ throw new IllegalArgumentException("\"" + name + "\" is not a valid name");
+ }
+ return obj;
+ }
+
+ /**
+ * Check that the specified {@link Enumeration} object is not {@code null}. This method is meant to be used with
+ * {@code ofName(String)} and {@code ofValue(int)} static factory methods.
+ *
+ * @param obj enumeration object, possibly null
+ * @param value User-supplied enumeration value
+ * @return Enumeration object
+ * @throws IllegalArgumentException if {@code obj} is null
+ */
+ public static <T extends Enumeration> @NonNull T checkEnum(final @Nullable T obj, final int value) {
+ if (obj == null) {
+ throw new IllegalArgumentException(value + " is not a valid value");
+ }
+ return obj;
+ }
+