Here’s a good (and somewhat surprising) reason keep your
toString implementations free of side effects.
The program below will, as shown in the screen shot, output
HeisenString in a normal run:
Now suppose we want to debug this program. We set a break point right before the
System.out.println and hit debug. Without really asking for it IntelliJ (and many other popular IDEs) show the string representation of the local variables:
This causes the
toString method to be called one extra time during debugging, and as a result the program outputs