package cse1030; /** * A class that represents an integer value that is always between some * minimum and maximum value. A range has three properties: minimum, * maximum, and value. Range objects always ensure that the following class invariant * is true: * *
* minimum <= value <= maximum
*
*
* The mutator methods of the class are responsible for ensuring that the
* above class invariant is always true. For example, if the minimum value of the
* range is changed so that it is greater than the current value, then the
* current value is also adjusted to maintain the class invariant. If the
* minimum value is changed so that it is greater than the maximum value,
* then both the maximum value and current value are also changed to maintain
* the class invariant.
*
* @author CSE1030Z
*
*/
public class Range {
private int min;
private int max;
private int value;
/**
* Create a range with minimum value 0, maximum value 100, and initial value
* 50.
*/
public Range() {
this(0, 100, 50);
}
/**
* Create a range with the specified minimum and maximum values. The initial
* value is set to half way between the minimum and maximum values (rounded
* down to the nearest integer if max - min
is odd).
*
* @param min
* the minimum value of the range
* @param max
* the maximum value of the range
* @throws IllegalArgumentException
* if min > max
*/
public Range(int min, int max) {
this(min, max, (max + min) / 2);
}
/**
* Create a range with the specified minimum, maximum, and initial values.
*
* @param min
* the minimum value of the range
* @param max
* the maximum value of the range
* @param init
* the initial value of the range
* @throws IllegalArgumentException
* if the constraint min <= init <= max
is not
* satisfied
*/
public Range(int min, int max, int init) {
if (min > max || min > init || max < init) {
throw new IllegalArgumentException("invalid range properties");
}
this.min = min;
this.value = init;
this.max = max;
}
/**
* Returns the minimum value of the range
*
* @return the minimum value of the range
*/
public int getMinimum() {
return this.min;
}
/**
* Sets the minimum value of the range to newMinimum
. The other
* properties of the range may be changed to ensure that:
*
*
* minimum <= value <= maximum
*
* @param newMinimum
* the new minimum of the range
*/
public void setMinimum(int newMinimum) {
this.min = newMinimum;
if (newMinimum > this.getMaximum()) {
this.setMaximum(newMinimum);
}
if (newMinimum > this.getValue()) {
this.setValue(newMinimum);
}
}
/**
* Returns the maximum value of the range
*
* @return the maximum value of the range
*/
public int getMaximum() {
return this.max;
}
/**
* Sets the maximum value of the range to newMaximum
. The other
* properties of the range may be changed to ensure that:
*
*
* minimum <= value <= maximum
*
* @param newMaximum
* the new maximum of the range
*/
public void setMaximum(int newMaximum) {
this.max = newMaximum;
if (newMaximum < this.getMinimum()) {
this.setMinimum(newMaximum);
}
if (newMaximum < this.getValue()) {
this.setValue(newMaximum);
}
}
/**
* Return the current value of the range.
*
* @return the value of the range
*/
public int getValue() {
return this.value;
}
/**
* Set the current value of the range to newValue
if
* newValue
satisfies the constraints of the range. Those
* constraints are:
*
*
* minimum <= value <= maximum
*
*
* Otherwise, if newValue < minimum
then the value is set to the
* minimum value of the range, and if newValue > maximum
then the
* value is set to the maximum value of the range.
*
* @param value
* the new value of the range
*/
public void setValue(int newValue) {
if (this.getMinimum() <= newValue && newValue <= this.getMaximum()) {
this.value = newValue;
} else if (newValue < this.getMinimum()) {
this.value = this.getMinimum();
} else {
this.value = this.getMaximum();
}
}
}