Not thread-safe. Java memory model allows another thread to see a partially initialised string rather than null (though this is unlike). Could declare field volatile. Or my preference would live with the cost of setting simpleName in the constructor because that code is simpler.