Java-компилятору не разрешено оптимизировать это.
Проблема в том, что вызовы методов для константных объектов не определены как константные выражения;см. JLS раздел 15.28 для списка вещей, которые вы можете сделать в константном выражении.Таким образом, s.charAt(0)
не является константным выражением, хотя s
является константным выражением, и «мы знаем», что его значение всегда будет 'T'
.Поскольку оно не является константным выражением, его нужно оценивать во время выполнения.
Если ваша цель состоит в том, чтобы предотвратить появление строки "ToInterBe"
в пуле констант классов, то вы добились успеха.Но это не замедлит хорошего реверс-инженера более чем на пару минут.
(Кстати, это выражение, вероятно, не соответствует вашим ожиданиям. Первое подвыражение +
является дополнением (не конкатенацией строк), поскольку ни один из операндов не является строкой. Результатом этого сложения будет int
, поэтому все выражение будет иметь значение "195InterBe"
... я думаю.)