CSR :
|
Summary ------- The methods `create(long)` and `create(byte[])` on `java.util.random.RandomGeneratorFactory` will now throw `java.lang.UnsupportedOperationException` if the underlying `java.util.RandomGenerator`, for the algorithm, does not support instantiation using a `long` seed or a `byte[]` seed respectively. Problem ------- `RandomGeneratorFactory` provides APIs to locate all or specific random number generators available in the Java runtime. Once located, the `RandomGeneratorFactory` provides the following 3 methods to construct instances of `java.util.random.RandomGenerator` for the corresponding algorithm: public T create(); public T create(long seed); public T create(byte[ ] seed); `create()` can be used to construct an instance of `RandomGenerator` without a seed value. The `create(long)` and `create(byte[])` methods allow applications to provide a seed value when constructing the `RandomGenerator`. In their current form, the `create(long)` and `create(byte[])` methods are specified to construct a `RandomGenerator` instance with the specified seed and if the `RandomGenerator` for that algorithm doesn't support a seed of that type, then these 2 create(...) methods will fallback to constructing the `RandomGenerator` instance without any seed value. This is problematic because the returned `RandomGenerator` instance from these 2 create(...) methods can end up being an unseeded `RandomGenerator`, when the application actually wanted the instances to be seeded with a specific seed. Morever, the calling application will not have any indication whether or not a seed value was successfully used to construct the `RandomGenerator` instance returned from these 2 create(...) methods. Solution -------- The specification of `create(long)` and `create(byte[])` will be changed to specify that if the `RandomGenerator` corresponding to a random generator algorithm doesn't support constructing the `RandomGenerator` instance with the provided seed type, then these 2 methods will throw an `UnsupportedOperationException`. These 2 methods will no longer fallback to constructing unseeded instances of `RandomGenerator`. Moreover, a line for the algorithm `SecureRandom`, which is missing from the table in the `java.util.random` package documentation, has been added there. Specification ------------- src/java.base/share/classes/java/util/random/RandomGeneratorFactory.java /** - * Create an instance of {@link RandomGenerator} based on + * Create an instance of {@link RandomGenerator} based on the * <a href="package-summary.html#algorithms">algorithm</a> chosen. * - * @return new in instance of {@link RandomGenerator}. - * + * @return new instance of {@link RandomGenerator}. */ public T create() { /** - * Create an instance of {@link RandomGenerator} based on - * <a href="package-summary.html#algorithms">algorithm</a> chosen - * providing a starting long seed. If long seed is not supported by an - * algorithm then the no argument form of create is used. + * Create an instance of {@link RandomGenerator} based on the + * <a href="package-summary.html#algorithms">algorithm</a> chosen, + * and the provided {@code seed}. + * If the {@link RandomGenerator} doesn't support instantiation through + * a {@code seed} of type {@code long} then this method throws + * an {@link UnsupportedOperationException}. * * @param seed long random seed value. * - * @return new in instance of {@link RandomGenerator}. + * @return new instance of {@link RandomGenerator}. + * + * @throws UnsupportedOperationException + * if a {@code seed} of type {@code long} in not supported. */ public T create(long seed) { /** - * Create an instance of {@link RandomGenerator} based on - * <a href="package-summary.html#algorithms">algorithm</a> chosen - * providing a starting byte[] seed. If byte[] seed is not supported by an - * <a href="package-summary.html#algorithms">algorithm</a> then the no - * argument form of create is used. + * Create an instance of {@link RandomGenerator} based on the + * <a href="package-summary.html#algorithms">algorithm</a> chosen, + * and the provided {@code seed}. + * If the {@link RandomGenerator} doesn't support instantiation through + * a {@code seed} of type {@code byte[ ]} then this method throws + * an {@link UnsupportedOperationException}. * * @param seed byte array random seed value. * - * @return new in instance of {@link RandomGenerator}. + * @return new instance of {@link RandomGenerator}. + * + * @throws UnsupportedOperationException + * if a {@code seed} of type {@code byte[ ]} in not supported. * * @throws NullPointerException if seed is null. */ public T create(byte[] seed) { src/java.base/share/classes/java/util/random/package-info.java * <td style="text-align:right">1</td> * </tr> * <tr> + * <th scope="row" style="text-align:left">SecureRandom</th> + * <td style="text-align:left">Legacy</td> + * <td style="text-align:left">BigInteger.ZERO</td> + * <td style="text-align:right">Integer.MAX_VALUE</td> + * <td style="text-align:right">Integer.MAX_VALUE</td> + * </tr> + * <tr> * <th scope="row" style="text-align:left">ThreadLocalRandom <sup>*</sup></th> * <td style="text-align:left">Legacy</td> * <td style="text-align:left">BigInteger.ONE.shiftLeft(64)</td>