AbstractXClock implements XClock<F> { @Override public final int hashCode() { LOGGER.trace("begin {}.hashCode()", getClass().getSimpleName()); _timeLock.lock(); try { final int rval = _time.hashCode(); LOGGER.trace("will return: {}", rval); LOGGER.trace("end {}.hashCode()", getClass().getSimpleName()); return rval; } finally { _timeLock.unlock(); } } protected  AbstractXClock(
            final long tick,
            final F phase,
            final F[] allPhases); protected  AbstractXClock(
            final F[] allPhases); @Override final XTime<F> getTime(); @Override final XTime<F> increment(); @Override void setTime(
            final XTime<F> time); @Override final int compareTo(
            final XClock<F> other); @Override final boolean equals(
            final Object obj); @Override final int hashCode(); @Override final String toString();  }
@Override @Test public final void hashCodeIdentical() { final AbstractXClockImpl clock = new AbstractXClockImpl(PhaseImpl .values()); assertThat(clock.hashCode(), is(clock.hashCode())); }
@Override @Test public final void hashCodeSameTime() { final AbstractXClockImpl clock = new AbstractXClockImpl(1, PhaseImpl.PHASE_1, PhaseImpl.values()); final AbstractXClockImpl sameClock = new AbstractXClockImpl(1, PhaseImpl.PHASE_1, PhaseImpl.values()); assertThat(clock.hashCode(), is(sameClock.hashCode())); }