 <p>You are trying to guard against <code>Child</code> being in an invalid state. Either</p> <ul> <li>use the builder pattern to create fully populated <code>Parent</code> types so that everything you expose to the consumer is always in a valid state</li> <li>remove the reference to the <code>Parent</code> completely</li> <li>have <code>Parent</code> create all instances of <code>Child</code> so this can never occur</li> </ul> <p>The latter case might look (something) like this (in Java):</p> <pre><code>public class DateRangeHolder { private final NavigableSet&lt;DateRange&gt; ranges = new TreeSet&lt;DateRange&gt;(); public void add(Date from, Date to) { DateRange range = new DateRange(this, from, to); if (ranges.contains(range)) throw new IllegalArgumentException(); DateRange lower = ranges.lower(range); validate(range, lower); validate(range, ranges.higher(lower == null ? range : lower)); ranges.add(range); } private void validate(DateRange range, DateRange against) { if (against != null &amp;&amp; range.intersects(against)) { throw new IllegalArgumentException(); } } public static class DateRange implements Comparable&lt;DateRange&gt; { // implementation elided } } </code></pre>