Есть ли намерения пересмотреть существующие классы платформы Java (JEP 360)?
Брайан Гетц упомянул в недавней статье на InfoQ, что созданиеString
final
вызвали проблемы:
Хороший пример, когда мы платим за это напряжение, - String; Для безопасности платформы критически важно, чтобы строки были неизменными, и поэтому String не может быть публично расширяемым, но было бы довольно удобно, если бы реализация имела несколько подтипов. (Стоимость обхода этого значительна; компактные строки обеспечили значительное улучшение занимаемой площади и производительности за счет особой обработки строк, состоящих исключительно из символов Latin-1, но это было бы намного проще и дешевле сделать, если бы String был запечатанным классом. вместо последнего.)
Он также упоминает, что создание final
класс sealed
обратно совместима:
Это изменение, совместимое с двоичным кодом и исходным кодом, призванное сделать существующий последний класс запечатанным. Запечатать неокончательный класс, для которого вы еще не контролируете все реализации, несовместимо ни с бинарным, ни с исходным кодом.
Есть ли какое-то намерение вернуться к некоторым из этих final
классы на платформе Java и сделать их sealed
вместо этого, чтобы получить преимущества в производительности (т.е. String
sealed
вместо того final
, с несколькими эффективными реализациями)?
1 ответ
Вы просите предсказать будущее, но это звучит так, будто вы ожидаете, что будет много классов, которым будет полезна настройка производительности. Кроме того, не то чтобы уплотнение требовалось для улучшения, если улучшения требуются, просто это могло бы упростить задачу сString
например. ИзготовлениеString
Запечатанный сейчас не так полезен, как если бы он был запечатан, скажем, 10 лет назад.
String
всегда был очень особенным и важным случаем, и из-за этого он был тщательно настроен (и отключен) даже без запечатанных классов: интернирование, общий массив символов, сжатые и компактные строки. Для этого всегда был очень хороший стимул, поскольку из любого дампа памяти ясно, чтоString
(а точнее его внутреннее char[]
, который в более поздних версиях byte[]
) - это то, что занимает больше всего памяти в приложениях.
Как вы думаете, есть последний класс, который действительно нужно настроить, или вы просто предполагаете, что классы неэффективны? Или вы надеетесь на какую-то общую очистку кодовой базы, которая, вероятно, приведет к очень низкой рентабельности инвестиций, учитывая, что вам нужно будет внести изменения, скорее всего, для очень небольшого улучшения производительности, но вам нужно будет провести много тестирования.
Кроме того, другие важные классы, отличные от String, также были настроены по-разному, у вас есть целочисленный кеш, встроенные функции JVM и многое другое, поэтому герметизация не является основным (или даже второстепенным) инструментом производительности.