Ostrava
From APIDesign
I'll be in Ostrava at JUG meeting on Mar 2nd, 2011. I'll talk about paradoxes, in a shorter version of the ParadoxesVideo. Stop by and get a chance to win TheAPIBook. I am not sure what will be the final quiz to win TheAPIBook, but I'd suggest following one: Can you write a code that throw NullPointerException directly from the following Interval class?
/** Quiz: Anyone can come up with a JUnit test to generate * {@link NullPointerException} directly from the code of * the <code>Interval</code> class? */ public final class Interval { private final Date from, to; /** Constructs interval between two dates. * * @param from the 'sooner' date * @param to the 'later' date * @throws IllegalArgumentException if <code>from</code> is not less then <code>to</code> */ public Interval(Date from, Date to) { if (from == null) { throw new IllegalArgumentException("'from' cannot be null!"); } if (to == null) { throw new IllegalArgumentException("'to' cannot be null!"); } // shield us from Date's mutability this.from = (Date) from.clone(); this.to = (Date)to.clone(); if (from.compareTo(to) >= 0) { throw new IllegalArgumentException("'from' must be lower than 'to'!"); } } /** The length of the interval in milliseconds * * @return amount of milliseconds between 'from' and 'to' dates. */ public long getLength() { return to.getTime() - from.getTime(); } }
I followed all the advices of TheAPIBook. I made the class final, I check for wrong arguments. My internal state is immutable. I guard myself against mutability of Date. Is it really write bullet proof code?