Если вы используете хотя бы java 8, вы делаете следующее:
public void myMethod(MyObject obj, Consumer<MyObject> action) {
for() {
for() {
if() {
action.accept(obj)
}
}
}
}
Теперь вы можете вызывать этот метод, передавая в него различные действия:
myMethod((obj) -> System.out.println(obj))
Мне нравится, насколько полностью открыт интерфейс Scope
: в основном, это просто преобразование из Provider
в Provider
. (Хорошо, с Key
и Provider
до Provider
)
Хотите, чтобы некоторые вещи были в основном одноэлементными, но перечитывались из базы данных каждые полчаса? Легко сделать простор для этого. Хотите запустить некоторые запросы в фоновом режиме и иметь область действия, которая означает, что «все фоновые запросы были запущены с одного и того же HTTP-запроса?» Это тоже довольно просто написать Scope
.
Хотите использовать некоторые Key
на своем сервере во время тестов, чтобы он использовал отдельный экземпляр для каждого теста, который вы запускаете с клиента? (С тестом, передающим идентификатор теста в Cookie или дополнительном параметре HTTP) Это сделать труднее, но это вполне возможно, и поэтому кто-то уже написал это для вас .
Да, чрезмерное злоупотребление Scope
заставит Джесси начать охоту на колья и зубчики чеснока, но его удивительная гибкость может быть действительно полезной.
Ни одна из них не предназначена для скрытия, но это мои любимые «бонусные функции» в Guice:
Одной из замечательных особенностей Guice является то, как легко он позволяет реализовать перехватчики методов в любом модуле
, используя:
public void bindInterceptor(
Matcher<? super Class<?>> classMatcher,
Matcher<? super Method> methodMatcher,
MethodInterceptor... interceptors);
Теперь любой метод, соответствующий methodMatcher
в классе, соответствующем classMatcher
в области видимости этого модуля
, перехватывается interceptors
.
Например:
bindInterceptor(
Matchers.any(),
Matchers.annotatedWith(Retryable.class),
new RetryableInterceptor());
Теперь мы можем просто аннотировать любой метод с @Retryable
и наш RetryableInterceptor
может
повторить попытку в случае неудачи.