Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8270313

SplittableRandom extends AbstractSplittableGenerator

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P2 P2
    • 17
    • core-libs
    • None
    • binary
    • low
    • The original code changes to random utilities have not been released as yet.
    • Java API
    • SE

      Summary

      SplittableRandom extends from jdk.internal.util.random.RandomSupport.AbstractSplittableGenerator which is not an exported package.

      Problem

      Since the package is not exported, jdeprscan cannot locate it.

      Solution

      Use a proxy object to hide the use of AbstractSplittableGenerator.

      Specification

      public final class SplittableRandom extends AbstractSplittableGenerator

      changes to

      public final class SplittableRandom implements RandomGenerator, SplittableGenerator

      specdiff attached.

      Full diff

          diff --git a/src/java.base/share/classes/java/util/SplittableRandom.java b/src/java.base/share/classes/java/util/SplittableRandom.java
          index 77bfa17593a..f3dd55a161a 100644
          --- a/src/java.base/share/classes/java/util/SplittableRandom.java
          +++ b/src/java.base/share/classes/java/util/SplittableRandom.java
          @@ -26,6 +26,8 @@ package java.util;
      
           import java.math.BigInteger;
           import java.util.concurrent.atomic.AtomicLong;
          +import java.util.random.RandomGenerator;
          +import java.util.random.RandomGenerator.SplittableGenerator;
           import java.util.stream.DoubleStream;
           import java.util.stream.IntStream;
           import java.util.stream.LongStream;
          @@ -86,13 +88,12 @@ import jdk.internal.util.random.RandomSupport.RandomGeneratorProperties;
            * @author  Doug Lea
            * @since   1.8
            */
          -@SuppressWarnings("exports")
           @RandomGeneratorProperties(
                   name = "SplittableRandom",
                   i = 64, j = 0, k = 0,
                   equidistribution = 1
           )
          -public final class SplittableRandom extends AbstractSplittableGenerator {
          +public final class SplittableRandom implements RandomGenerator, SplittableGenerator {
      
               /*
                * Implementation Overview.
          @@ -182,6 +183,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
               private SplittableRandom(long seed, long gamma) {
                   this.seed = seed;
                   this.gamma = gamma;
          +        this.proxy = new AbstractSplittableGeneratorProxy();
               }
      
               /**
          @@ -216,6 +218,31 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                   return (n < 24) ? z ^ 0xaaaaaaaaaaaaaaaaL : z;
               }
      
          +    /**
          +     * Proxy class to non-public RandomSupportAbstractSplittableGenerator.
          +     */
          +    private class AbstractSplittableGeneratorProxy extends AbstractSplittableGenerator {
          +        @Override
          +        public int nextInt() {
          +            return SplittableRandom.this.nextInt();
          +        }
          +
          +        @Override
          +        public long nextLong() {
          +            return SplittableRandom.this.nextLong();
          +        }
          +
          +        @Override
          +        public java.util.SplittableRandom split(SplittableGenerator source) {
          +            return new SplittableRandom(source.nextLong(), mixGamma(source.nextLong()));
          +        }
          +    }
          +
          +    /**
          +     * Proxy object to non-public RandomSupportAbstractSplittableGenerator.
          +     */
          +    private AbstractSplittableGeneratorProxy proxy;
          +
               /**
                * Adds gamma to seed.
                */
          @@ -251,6 +278,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                   long s = defaultGen.getAndAdd(2 * GOLDEN_GAMMA);
                   this.seed = mix64(s);
                   this.gamma = mixGamma(s + GOLDEN_GAMMA);
          +        this.proxy = new AbstractSplittableGeneratorProxy();
               }
      
               /**
          @@ -297,7 +325,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public void nextBytes(byte[] bytes) {
          -        super.nextBytes(bytes);
          +        proxy.nextBytes(bytes);
               }
      
               /**
          @@ -307,7 +335,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public Stream<SplittableGenerator> splits() {
          -        return super.splits();
          +        return proxy.splits();
               }
      
               /**
          @@ -318,7 +346,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public Stream<SplittableGenerator> splits(long streamSize) {
          -        return super.splits(streamSize, this);
          +        return proxy.splits(streamSize, this);
               }
      
               /**
          @@ -329,7 +357,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public Stream<SplittableGenerator> splits(SplittableGenerator source) {
          -        return super.splits(Long.MAX_VALUE, source);
          +        return proxy.splits(Long.MAX_VALUE, source);
               }
      
               /**
          @@ -341,7 +369,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public Stream<SplittableGenerator> splits(long streamSize, SplittableGenerator source) {
          -        return super.splits(streamSize, source);
          +        return proxy.splits(streamSize, source);
               }
      
               /**
          @@ -356,7 +384,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public IntStream ints(long streamSize) {
          -        return super.ints(streamSize);
          +        return proxy.ints(streamSize);
               }
      
               /**
          @@ -370,7 +398,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public IntStream ints() {
          -        return super.ints();
          +        return proxy.ints();
               }
      
               /**
          @@ -390,7 +418,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound) {
          -        return super.ints(streamSize, randomNumberOrigin, randomNumberBound);
          +        return proxy.ints(streamSize, randomNumberOrigin, randomNumberBound);
               }
      
               /**
          @@ -410,7 +438,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public IntStream ints(int randomNumberOrigin, int randomNumberBound) {
          -        return super.ints(randomNumberOrigin, randomNumberBound);
          +        return proxy.ints(randomNumberOrigin, randomNumberBound);
               }
      
               /**
          @@ -425,7 +453,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public LongStream longs(long streamSize) {
          -        return super.longs(streamSize);
          +        return proxy.longs(streamSize);
               }
      
               /**
          @@ -439,7 +467,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public LongStream longs() {
          -        return super.longs();
          +        return proxy.longs();
               }
      
               /**
          @@ -459,7 +487,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public LongStream longs(long streamSize, long randomNumberOrigin, long randomNumberBound) {
          -        return super.longs(streamSize, randomNumberOrigin, randomNumberBound);
          +        return proxy.longs(streamSize, randomNumberOrigin, randomNumberBound);
               }
      
               /**
          @@ -479,7 +507,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public LongStream longs(long randomNumberOrigin, long randomNumberBound) {
          -        return super.longs(randomNumberOrigin, randomNumberBound);
          +        return proxy.longs(randomNumberOrigin, randomNumberBound);
               }
      
               /**
          @@ -494,7 +522,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public DoubleStream doubles(long streamSize) {
          -        return super.doubles(streamSize);
          +        return proxy.doubles(streamSize);
               }
      
               /**
          @@ -509,7 +537,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public DoubleStream doubles() {
          -        return super.doubles();
          +        return proxy.doubles();
               }
      
               /**
          @@ -529,7 +557,7 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public DoubleStream doubles(long streamSize, double randomNumberOrigin, double randomNumberBound) {
          -        return super.doubles(streamSize, randomNumberOrigin, randomNumberBound);
          +        return proxy.doubles(streamSize, randomNumberOrigin, randomNumberBound);
               }
      
               /**
          @@ -549,6 +577,6 @@ public final class SplittableRandom extends AbstractSplittableGenerator {
                */
               @Override
               public DoubleStream doubles(double randomNumberOrigin, double randomNumberBound) {
          -        return super.doubles(randomNumberOrigin, randomNumberBound);
          +        return proxy.doubles(randomNumberOrigin, randomNumberBound);
               }
           }

            jlaskey Jim Laskey
            jlahoda Jan Lahoda
            Brian Burkhalter, Roger Riggs
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: