They never should’ve made the String object pass by value. It negatively reinforces the difference between objects and values. I run into confusion on this point quite a bit. Developers who have had limited access to mid-level languages like C don’t often stop and think about the difference. If you had to use a clone() method, or even toString() every time you passed a String, it’s not likely they would forget. I wonder if the man-hours saved from String’s pseudo-object convenience has offset the hours spent on bugs that result from misunderstanding references.