У меня есть класс служебных / констант, который содержит Map<String, Authorizer>
, где Authorizer
- это интерфейс с несколькими различными реализациями. Я использую карту в разных потоках, чтобы получить объект, содержащий некоторое String
(название подхода к авторизации), который затем сопоставляется с конкретным Authorizer
, который затем завершает некоторую авторизацию.
Я использую Guice для подключения Authorizer
классов, но этот подход не позволяет мне сделать служебный класс (который содержит Map
) настоящим служебным классом с пустым частным конструктором. У меня есть забавный обходной путь, который нравится как Guice, так и Checkstyle, но я хочу знать, есть ли способ лучше.
Мой класс полезности:
public final class Constants {
@Inject
private Constants() {}
public static final String AUTH_METHOD_ONE = "Auth1";
public static final String AUTH_METHOD_TWO = "Auth2";
@Singleton
@Inject
@Getter // For Checkstyle, as AUTH_METHODS isn't a true static final constant
private static Map<String, Authorizer> authMethods;
}
Мой модуль констант:
public class ConstantsModule extends AbstractModule {
@Override
public void configure() {
requestStaticInjection(Constants.class);
final MapBinder<String, Authorizer> mapBinder = MapBinder.newMapBinder(binder(), String.class, Authenticator.class);
mapBinder.addBinding(AUTH_METHOD_ONE).to(MethodOneAuthorizer.class);
mapBinder.addBinding(AUTH_METHOD_TWO).to(MethodTwoAuthorizer.class);
}
}
И пример использования:
public class AuthorizationOrchestrator {
private static Authorizer getAuthorizer(final AuthorizationState state) {
return state.getMethods().stream()
.map(AuthorizationApproach::getAuthorizationApproachName)
.filter(Constants.getAuthMethods().keySet()::contains)
.findFirst()
.map(Constants.getAuthMethods()::get)
.orElse(null);
}
}
Этот подход также требует использования PowerMock в модульных тестах. Есть ли лучший способ:
- Сопоставить имена подходов к авторизации классу
Authorizer
, сохранив сопоставление в одном месте? - Использовать класс
Constants
как истинный служебный класс сpublic static final Map<String, Authorizer> AUTH_METHODS
, но при этом иметь возможность вводить авторизаторы вMap
?