private DiscoverableEnums(final String basePackage, final Class<T> type) { final Set<Class<T>> discoverableEnums = scanDiscoverableEnums(basePackage, type); final Map<Class<?>, Map<String, T>> typeToText2ConstantMap = newLinkedHashMap(); final Map<String, T> text2ConstantAllInOneMap = newLinkedHashMap(); final Map<String, Collection<String>> discoverableEnumTexts = newLinkedHashMap(); discoverableEnums.forEach(discoverableEnum -> { final Map<String, T> text2ConstantMap = text2ConstantMap(discoverableEnum); typeToText2ConstantMap.put(discoverableEnum, text2ConstantMap); text2ConstantMap.entrySet().forEach(entry -> { final String text = entry.getKey(); final T constant = entry.getValue(); if (text2ConstantAllInOneMap.containsKey(text)) { throw new IllegalArgumentException("'" + text + "' of '" + constant + "' conflict with '" + text + "' of '" + text2ConstantAllInOneMap.get(text).getDeclaringClass() + "'"); } text2ConstantAllInOneMap.put(text, constant); }); discoverableEnumTexts.put(StringUtils.lowerCaseFirstChar(discoverableEnum.getSimpleName()), ImmutableList.copyOf(enumTexts(discoverableEnum))); }); this.type2TextConstantMap = ImmutableMap.copyOf(typeToText2ConstantMap); this.allTextConstantMap = ImmutableMap.copyOf(text2ConstantAllInOneMap); }