equals/hashCode need to be final to guarantee correct semantics if someone decides to override this class.