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  | 
				||
| (One intermediate revision by one other user not shown) | |||
| Line 63: | Line 63: | ||
}  | }  | ||
</geshi>  | </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>  | |||
[[Category:Java]]  | |||
Latest revision as of 02:31, 1 October 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>