/**
  * Create a ResizableArray with the specified properties.
  *
  * <p>Throws IllegalArgumentException if the following conditions are not met:
  *
  * <ul>
  *   <li><code>initialCapacity > 0</code>
  *   <li><code>expansionFactor > 1</code>
  *   <li><code>contractionFactor >= expansionFactor</code>
  *   <li><code>expansionMode in {MULTIPLICATIVE_MODE, ADDITIVE_MODE}</code>
  * </ul>
  *
  * @param initialCapacity the initial size of the internal storage array
  * @param expansionFactor the array will be expanded based on this parameter
  * @param contractionCriteria the contraction Criteria
  * @param expansionMode the expansion mode
  * @throws IllegalArgumentException if parameters are not valid
  */
 public ResizableDoubleArray(
     int initialCapacity, float expansionFactor, float contractionCriteria, int expansionMode) {
   this.expansionFactor = expansionFactor;
   setContractionCriteria(contractionCriteria);
   setInitialCapacity(initialCapacity);
   setExpansionMode(expansionMode);
   internalArray = new double[initialCapacity];
 }