Почему у всех языков неправильный toString?
От: vsb Казахстан  
Дата: 19.12.18 00:23
Оценка: +2 -1
Для чего нужен toString? Ну очевидно, в 99% случаев для того, чтобы распечатать содержимое объекта куда-нибудь. Что значит "распечатать"? Это значит вызвать write в какой-то сокет или файловый дескриптор. То бишь когда мы пишем System.out.println(list), мы сначала аллоцируем StringBuilder из 16 символов, потом в него добавляем все элементы, для каждого опять же вызывая toString, скорее всего аллоцируя новую строку, в процессе переаллоцируя буфер 1-2 раза, после этого этот StringBuilder преобразуем в строку копируя все накопленные байты и потом эту строку пихаем в сокет. Десятки лишних объектов, моментально уходящих в мусор, килобайты лишней памяти на такую примитивную операцию. Не разумней ли объявить toString в виде toString(Writer result). В него уже объект будет писать своё содержимое с нулём аллокаций и любой степенью сложности. Ну а если кому-то таки понадобится строка, это тривиально выражается через такую реализацию. Почему везде пляшут от обратного и выбирают заведомо неэффективную архитектуру в качестве базового блока, а не наоборот? По-моему только в Rust это сделано правильно.
Отредактировано 19.12.2018 0:26 vsb . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.