use of Objects methods to build toString and hashcode implementations, and using firstNotNull for default values