I used to use the implicit call of toString when wanting some debug info about an object, because in case of the object is null it does not throw an Exception.
For i
Actually, if your invariant says the object should never be null, it doesn't matter. So it depends on whether or not you accept obj to be null.