Я хочу воспроизвести «статическую» инъекцию RxJava с использованием RxJavaPlugins и i'am wondring, если дизайн этого класса хорошо известен!?
У меня есть базовый класс модели для всех моих событий
import lombok.Getter;
public abstract class BasicEvent {
@Getter
private final String id;
@Getter
private final long timestamp;
public BasicEvent() {
this.id = IDGenerator.BY_COUNTER.generate();
this.timestamp = TimePlayer.clock().timestamp();
}
}
Основным недостатком вышеприведенного класса является тестируемость. Я не могу изменить IDGenerator и TimePlayer.
Я думаю, что наличие стороннего класса, разработанного как RxJavaPlugins, могло бы помочь мне изменить мои генераторы метаданных для тестов
ОБНОВЛЕНИЕ .
Я следовал решению RxJavaPlugins для простоты создания модели, не беспокоясь об идентификаторе и метке времени (я назвал метаданные двух полей), вот решение найдено.
public BasicEvent() {
this.id = MetaGenerator.idGenerator().generate();
this.timestamp = MetaGenerator.timePlayer().timestamp();
}
public class MetaGenerator {
public static IDGenerator idGenerator() {
// DGenerator.BY_COUNTER is the default value
return MetaGeneratorPlugins.onIDGenerator(IDGenerator.BY_COUNTER);
}
public static TimePlayer timePlayer() {
return MetaGeneratorPlugins.onTimePlayer(TimePlayer.realtime);
}
}
public class MetaGeneratorPlugins {
private static Function<? super TimePlayer, ? extends TimePlayer> onTimePlayerHandler;
private static Function<? super IDGenerator, ? extends IDGenerator> onIDGeneratorHandler;
public static void setTimePlayerHandler(@Nullable Function<? super TimePlayer, ? extends TimePlayer> handler) {
onTimePlayerHandler = handler;
}
public static void setIDGeneratorHandler(@Nullable Function<? super IDGenerator, ? extends IDGenerator> handler) {
onIDGeneratorHandler = handler;
}
//return the default value or the value returned by the handler
public static TimePlayer onTimePlayer(@Nonnull TimePlayer defaultScheduler) {
if (onTimePlayerHandler == null) {
return defaultScheduler;
}
return apply(onTimePlayerHandler, defaultScheduler);
}
public static IDGenerator onIDGenerator(@Nonnull IDGenerator defaultScheduler) {
if (onIDGeneratorHandler == null) {
return defaultScheduler;
}
return apply(onIDGeneratorHandler, defaultScheduler);
}
private static <T, R> R apply(@Nonnull Function<T, R> f, @Nonnull T t) {
return f.apply(t);
}
}
В моих тестах теперь я могу изменить реализацию этого MetaGenerator, вызвав MetaGeneratorPlugins
MetaGeneratorPlugins.setIDGeneratorHandler(IDGenerator.INCREMENTAL);
MetaGeneratorPlugins.setTimePlayerHandler(TimePlayer.simulated);
Так работает RxJavaPlugins, меня вдохновило их решение,
Теперь мои модели просты и работают для производства и тестирования.