Just add more info on toString() and String.valueOf() .
String.valueOf() cannot be relied upon to get the name of the Apex class at runtime. I don't think this is documented, but if you add the toString() method to your custom class with an override keyword, then String.valueOf() will use this to determine the string value of your object.
class MyClassDefaultToString { } class MyClassOverrideToString { public override String toString() { return 'override toString'; } } MyClassDefaultToString c1 = new MyClassDefaultToString(); System.assertEquals('MyClassDefaultToString:[]', String.valueOf(c1)); MyClassOverrideToString c2 = new MyClassOverrideToString(); System.assertNotEquals('MyClassOverrideToString:[]', String.valueOf(c2)); System.assertEquals('override toString', String.valueOf(c2));
source share