2013-06-28 4 views
13

Если вы посмотрите на исходный код реализации Sun Class.getSimpleName(), вы заметите, что он возвращает новый экземпляр String каждый раз, когда вы его вызываете. Однако многие другие функции класса Class кэшируются.Почему Class.getSimpleName() не кэшируется?

Поскольку простое вычисление имен не кажется легким, и в JavaDoc нет ничего, чтобы сказать, что он должен каждый раз возвращать новый экземпляр, он должен быть хорошим кандидатом на кеширование. Мне интересно, может ли быть какая-нибудь причина дизайна, почему это не кэшировано?

Я спрашиваю, потому что многие фреймворки используют простые имена все время, и это такая легкая вещь для кеширования.

+4

Кэширование это увеличило бы память, хранящуюся в каждом классе, для сомнительного повышения производительности. –

+0

Вы всегда можете добавить свое собственное кеширование, используя 'AspectJ', если хотите. – selig

+0

@JBNizet Но для любого типа без массива операция является подстрокой потенциально интернированной строки, которая не требует большой дополнительной памяти. –

ответ

2

Возможно, потому что это не дорогостоящий метод, поэтому его кэширования не так много.

String.substring - дешевый метод - он повторно использует базовый char[], не копируя его, а новый объект String имеет только смещение и длину в этом массиве. Так что действительно единственные затраты: (1) выделение объектов - что довольно дешево на Java - и (2) вызов lastIndexOf. Этот вызов технически O (N), но N здесь - простое имя класса, которое на практике не будет очень большим.

Вы можете кэшировать его, но за счет большей памяти. Я предполагаю, что кто-то сделал субъективное, но образованное предположение, что выгоды не перевешивают издержки.

+2

. Наиболее значительная стоимость здесь не будет подстрокой(), а другими методами, которые вызываются, чтобы получить строку подстрокой. Есть 'getSimpleBinaryName()', который безоговорочно вызывает 'getEnclosingClass()', который вызывает 'getEnclosingMethodInfo()' и т. Д. Весь процесс выглядит не очень дешевым для меня. –

+0

@ billc.cn Я не знаю, все это заканчивается на нативных методах, таких как 'getEnclosingMethod0()'. Трудно знать, насколько это дешево или дорого. – yshavit

+1

'подстрока' * иногда * использует базовый массив символов - это зависит от конкретной реализации. –

1

Интересный вопрос. Поскольку String является неизменным классом, на самом деле не имеет значения, возвращаете ли вы отдельные экземпляры или ссылку на один и тот же объект. Мое предположение было бы (и я даю ему в основном услышать, правильно ли я или неправильно), что, возможно, метод не вызывается очень часто, и имеет смысл повторно создать объект (String), чем хранить его в памяти. Но опять же, это просто догадка.