ComparableRange has inconsistent access to the instance variables of other ComparableRanges. There are several methods that do some kind of comparison with another range. Sometimes, those methods call the accessor methods. Other times, direct variable access is used.
Here's my take on this issue, based on the Concurrency in Practice book. If ComparableRange is final, and not meant to be extended, then always do direct access, period. If ComparableRange is supposed to be extended by other classes, then make the instance variables final(to force extended classes to use the accessors), then the base class always must use the accessors. Of course, this kind of design pattern needs to be imployed in the rest of the code too.