Range: Difference between revisions
(New page: Martin Fowler has written about the http://martinfowler.com/eaaDev/Range.html Range Base Pattern for representing a range of values. Here's a generic base class I wrote in Java which ...) |
mNo edit summary |
||
| Line 60: | Line 60: | ||
public String toString() { | public String toString() { | ||
return min + ".." + max; | return min + ".." + max; | ||
} | |||
} | |||
</geshi> | |||
And of course the unit test | |||
<geshi lang="java"> | |||
public class RangeUnitTest extends UnitTestCase { | |||
public void testContains() { | |||
Range<Integer> range = new Range<Integer>(3, 5); | |||
assertFalse(range.contains(2)); | |||
assertTrue(range.contains(3)); | |||
assertTrue(range.contains(4)); | |||
assertTrue(range.contains(5)); | |||
assertFalse(range.contains(6)); | |||
} | |||
public void testCtor() { | |||
try { | |||
new Range<Integer>(5, 3); | |||
failIfNoExceptionThrown(); | |||
} catch (IllegalArgumentException e) { | |||
pass(); | |||
} | |||
} | } | ||
} | } | ||
</geshi> | </geshi> | ||
Revision as of 12:50, 12 September 2007
Martin Fowler has written about the [Range Base Pattern] for representing a range of values. Here's a generic base class I wrote in Java which has the same basic functionality. I usually subclass this and add type specific methods.
<geshi lang="java"> /**
* A generic range. I would prefer to define this as Range<E extends Comparable<? super E>>, * but then pre 1.5 types can't be used with this. * Additionally, you run into hell when you have Base implements Comparable<Base> and want to have * Derived extends Base. Derived can't implement Comparable<Derived> because it's already defined differently * in the base class. */
public class Range<E extends Comparable> {
protected final E min; protected final E max;
public Range(E min, E max) {
GuardHelper.notNullMultiple(min, max);
validate(min, max);
this.min = min;
this.max = max;
}
protected void validate(E min, E max) {
if (min.compareTo(max) > 0) {
throw new IllegalArgumentException(min + " < " + max);
}
}
public boolean contains(E value) {
return value != null && min.compareTo(value) <= 0
&& max.compareTo(value) >= 0;
}
public E getMinimum() {
return min;
}
public E getMaximum() {
return max;
}
public int hashCode() {
return min.hashCode() + max.hashCode();
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Range range = (Range) o;
return max.equals(range.max) && min.equals(range.min); }
@Override
public String toString() {
return min + ".." + max;
}
} </geshi>
And of course the unit test <geshi lang="java"> public class RangeUnitTest extends UnitTestCase {
public void testContains() {
Range<Integer> range = new Range<Integer>(3, 5);
assertFalse(range.contains(2));
assertTrue(range.contains(3));
assertTrue(range.contains(4));
assertTrue(range.contains(5));
assertFalse(range.contains(6));
}
public void testCtor() {
try {
new Range<Integer>(5, 3);
failIfNoExceptionThrown();
} catch (IllegalArgumentException e) {
pass();
}
}
} </geshi>