Во-первых, объективная часть вашего вопроса: есть ли выигрыш в производительности от объявления бревенчатый о статические конечные, то есть:
private static final String SUCCESS = "Success!";
//[...]
log.info(SUCCESS);
log.info(SUCCESS);
// versus:
log.info("Success!");
log.info("Success!");
В JLS состояний в section 3.10.5:
[A] Строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений (§15.28), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.
Так ли ваша строка литерала объявляется один раз как static final
или несколько раз появляется в исходном коде, он всегда будет таким же строка экземпляром везде, где он используется, и, таким образом, занимает такое же количество памяти, и будет доступен точно так же. Не будет разницы в производительности.
Теперь другая часть вопроса: это хорошая идея? Это по своей сути субъективно, но я считаю, что вам следует избегать объявления журнальных сообщений как static final
. Сообщения журнала добавляют к читабельности кода, что особенно ценно, когда код поддерживается людьми, которые его не пишут. Например:
log.warn(LOGIN_ERROR_OCCURRED, userId, attempt);
// compared to:
log.warn("Login failed for user {}; attempt {} of 5.", userId, attempt);
Это гораздо быстрее и легче читать сообщения журнала в контексте кода, вместо того, чтобы прыгать куда-то в коде, чтобы увидеть полное сообщение журнала.
Есть ли что-то неправильное в том, как я задал этот вопрос? Пожалуйста, предложите, я изменю его – Andy897
«Строка, используемая для ведения журнала» - вы имеете в виду текстовые значения, используемые в качестве сообщений журнала? Если это так, на самом деле - найдите String константу интернирования в Java. – chrylis
Да, вот что я имел в виду. Редактирование вопроса, чтобы сказать это явно. спасибо за комментарий – Andy897