[PATCH] 8178117: Add public state constructors for Int/Long/DoubleSummaryStatistics

Peter Levart peter.levart at gmail.com
Wed Apr 12 16:27:20 UTC 2017



On 04/12/2017 04:41 PM, Peter Levart wrote:
> On 04/11/2017 10:48 PM, Chris Dennis wrote:
>> Color me confused… what would the javadoc on the parameter say? It 
>> could I guess have an @implNote documenting the meanings of the 
>> parameters… but then what use is it? The proposed API simply limits 
>> the precision with which a DoubleSummaryStatistic can be copied to be 
>> the same as the precision with which it can be “accessed”. That 
>> doesn’t seem an enormous problem since I suspect that bulk of usages 
>> would be to marshall a “finished” instance and therefore there is no 
>> real loss occuring. If we wanted to support arbitrary precision 
>> wouldn’t it be better to have a constructor variant that took a 
>> BigDecimal, and a matching getPreciseSum() that returned a BigDecimal?
>
> And how would you compute the value for BigDecimal getPreciseSum() so 
> that you could then set 3 internal double fields from BigDecimal 
> without loss of information? 


...perhaps we could use the BigDecimal getPreciseSum() together with 
getSum() to reconstruct the state. For exmaple:

     /**
      * Construct an instance with values obtained from another instance.
      *
      * @param count what was returned from another instance's {@link 
#getCount()}
      * @param sum what was returned from another instance's {@link 
#getSum()}
      * @param preciseSum what was returned from another instance's 
{@link #getPreciseSum()}
      * @param min what was returned from another instance's {@link 
#getMin()}
      * @param max what was returned from another instance's {@link 
#getMax()}
      */
     public DoubleSummaryStatistics(long count,
                                    double sum, BigDecimal preciseSum,
                                    double min, double max) {
         if (count < 0L) {
             throw new IllegalArgumentException("count < 0");
         } else if (count > 0L) {
             if (min > max) {
                 throw new IllegalArgumentException("min > max");
             }
             this.count = count;
             this.min = min;
             this.max = max;
             setSum(sum, preciseSum);
         }
     }

     /**
      * If {@link #getSum()} returns {@link Double#NaN} or {@link 
Double#POSITIVE_INFINITY}
      * or {@link Double#NEGATIVE_INFINITY}, then this method returns 
{@code null},
      * otherwise it returns a value that is a more precise 
representation of the
      * sum of values recorded and can be used in
      * {@link #DoubleSummaryStatistics(long, double, BigDecimal, 
double, double)}
      * to construct an object with internal state that closely 
resembles the state of
      * original object.
      *
      * @return a precise sum in BigDecimal form.
      */
     public final BigDecimal getPreciseSum() {
         double sum = getSum();
         if (Double.isNaN(sum) || Double.isInfinite(sum)) {
             return null;
         } else {
             return new BigDecimal(this.sum).add(
                 new BigDecimal(this.sumCompensation));
         }
     }

     private void setSum(double sum, BigDecimal preciseSum) {
         if (preciseSum == null) {
             if (!Double.isNaN(sum) && !Double.isInfinite(sum)) {
                 throw new IllegalArgumentException(
                     "preciseSum is null but sum is not a NaN and not 
Infinite");
             }
             this.sum = this.simpleSum = sum;
             this.sumCompensation = 0d;
         } else {
             if (Double.isNaN(sum) || Double.isInfinite(sum)) {
                 throw new IllegalArgumentException(
                     "preciseSum is non-null but sum is NaN or Infinite");
             }
             this.sum = this.simpleSum = preciseSum.doubleValue();
             this.sumCompensation = preciseSum.subtract(new 
BigDecimal(this.sum)).doubleValue();
         }
     }


Hm....


Regards, Peter



More information about the core-libs-dev mailing list