Data Type Java

//package aima.core.util.math;
import java.util.List;
/**
 * @author Ciaran O'Reilly see:
 *         http://demonstrations.wolfram.com/MixedRadixNumberRepresentations/
 *         for useful example.
 */
public class MixedRadixNumber extends Number {
  //
  private static final long serialVersionUID = 1L;
  //
  private long value = 0L;
  private long maxValue = 0L;
  private int[] radixs = null;
  private int[] currentNumeralValue = null;
  private boolean recalculate = true;
  public MixedRadixNumber(long value, int[] radixs) {
    this.value = value;
    this.radixs = new int[radixs.length];
    System.arraycopy(radixs, 0, this.radixs, 0, radixs.length);
    calculateMaxValue();
  }
  public MixedRadixNumber(long value, List radixs) {
    this.value = value;
    this.radixs = new int[radixs.size()];
    for (int i = 0; i < radixs.size(); i++) {
      this.radixs[i] = radixs.get(i);
    }
    calculateMaxValue();
  }
  public long getMaxAllowedValue() {
    return maxValue;
  }
  public boolean increment() {
    if (value < maxValue) {
      value++;
      recalculate = true;
      return true;
    }
    return false;
  }
  public boolean decrement() {
    if (value > 0) {
      value--;
      recalculate = true;
      return true;
    }
    return false;
  }
  public int getCurrentNumeralValue(int atPosition) {
    if (atPosition >= 0 && atPosition < radixs.length) {
      if (recalculate) {
        long quotient = value;
        for (int i = 0; i < radixs.length; i++) {
          if (0 != quotient) {
            currentNumeralValue[i] = (int) quotient % radixs[i];
            quotient = quotient / radixs[i];
          } else {
            currentNumeralValue[i] = 0;
          }
        }
        recalculate = false;
      }
      return currentNumeralValue[atPosition];
    }
    throw new IllegalArgumentException(
        "Argument atPosition must be >=0 and < " + radixs.length);
  }
  //
  // START-Number
  @Override
  public int intValue() {
    return (int) longValue();
  }
  @Override
  public long longValue() {
    return value;
  }
  @Override
  public float floatValue() {
    return longValue();
  }
  @Override
  public double doubleValue() {
    return longValue();
  }
  // END-Number
  //
  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < radixs.length; i++) {
      sb.append("[");
      sb.append(this.getCurrentNumeralValue(i));
      sb.append("]");
    }
    return sb.toString();
  }
  //
  // PRIVATE
  //
  private void calculateMaxValue() {
    if (0 == radixs.length) {
      throw new IllegalArgumentException(
          "At least 1 radix must be defined.");
    }
    for (int i = 0; i < radixs.length; i++) {
      if (radixs[i] < 2) {
        throw new IllegalArgumentException(
            "Invalid radix, must be >= 2");
      }
    }
    // Calcualte the maxValue allowed
    maxValue = radixs[0];
    for (int i = 1; i < radixs.length; i++) {
      maxValue *= radixs[i];
    }
    maxValue -= 1;
    if (value > maxValue) {
      throw new IllegalArgumentException(
          "The value ["
              + value
              + "] cannot be represented with the radixs provided, max value is "
              + maxValue);
    }
    currentNumeralValue = new int[radixs.length];
  }
}