The text essentially states that the constructor is private so that an invalid instance can't be made. The problem is that one can still use the case class' copy method and end up with an invalid instance.

It seems we could override copy and delegate to our smart constructor. It feels like that should always be safe assuming the smart constructor has no side effects (which it shouldn't). Does that sound right?

Also, private keeps you from calling "new CheckingAccount(...)", but the case class' apply() is still there. Is this a similar case as before where we should override apply in the companion object and call the smart constructor (or make them one in the same)?