Интерфейс RandomGenerator
Использование интерфейса RandomGenerator для выбора алгоритмов генерации случайных чисел по имени без привязки к конкретному классу.
Сравнение кода
✕ Java 8
// Hard-coded to one algorithm
Random rng = new Random();
int value = rng.nextInt(100);
// Or thread-local, but still locked in
int value = ThreadLocalRandom.current()
.nextInt(100);
✓ Java 17+
// Algorithm-agnostic via factory
var rng = RandomGenerator.of("L64X128MixRandom");
int value = rng.nextInt(100);
// Or get a splittable generator
var rng = RandomGeneratorFactory
.of("L64X128MixRandom").create();
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Независимость от алгоритма
Выбор лучшего алгоритма RNG по имени без изменения структуры кода.
Лучшие алгоритмы
Доступ к современным генераторам LXM с превосходными статистическими свойствами.
Единый API
Один интерфейс охватывает Random, ThreadLocalRandom, SplittableRandom и другие.
Старый подход
new Random() / ThreadLocalRandom
Современный подход
Фабрика RandomGenerator
Начиная с JDK
17
Сложность
Средний
Поддержка JDK
Интерфейс RandomGenerator
Доступно
Доступно с JDK 17 (сентябрь 2021, JEP 356).
Как это работает
JDK 17 представил RandomGenerator как общий интерфейс для всех реализаций RNG. Вместо жёсткой привязки к new Random() или ThreadLocalRandom можно выбирать алгоритмы по имени через фабрику, что упрощает переключение между алгоритмами, оптимизированными для разных сценариев (скорость, статистическое качество, делимость).
Связанная документация
Доказательство