Alex Herbert created RNG-192:
--------------------------------
Summary: Remove use of overriddable instance method for state
initialisation
Key: RNG-192
URL: https://issues.apache.org/jira/browse/RNG-192
Project: Commons RNG
Issue Type: Improvement
Components: core
Affects Versions: 1.6
Reporter: Alex Herbert
The {{org.apache.commons.rng.core.BaseProvider}} provides methods to fill a
state array using a seed array:
{code:java}
protected void fillState(int[] state, int[] seed)
protected void fillState(long[] state, long[] seed)
{code}
If the seed is not long enough then it is extended using a random generator.
The method is used in the constructor by:
* DotyHumphreySmallFastCounting32
* KISSRandom
* MultiplyWithCarry256
* DotyHumphreySmallFastCounting64
* PcgRxsMXs64
* XorShift1024Star
This generates a compile time warning on JDK 21+: "possible 'this' escape
before subclass is fully initialized". This is due to this feature:
[JDK-8299995: Add lint check for calling overridable methods from a
constructor|https://bugs.openjdk.org/browse/JDK-8299995]
Since the method is a non-final protected instance method it is possible for
the method to be overridden by sub-classes to alter construction behaviour.
h2. Solution
Unexpected behaviour of partially initialised classes can be avoided by
altering the constructors to call the alternative seeding methods in the
{{BaseProvider}} to extend an input seed:
{code:java}
protected static long[] extendSeed(long[] seed, int length)
protected static int[] extendSeed(int[] seed, int length)
{code}
This will introduce a behavioural change to the listed RNGs when used with a
seed that does not fill the entire state of the generator:
Use of a fixed seed will change the output sequence. This may effect code that
relies on certain output, for example unit tests on pseudorandom data.
Use of a random seed will continue to output a random sequence from the
generator.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)