2017-01-09 5 views
1

Это хорошая идея объявить, что весь текст будет использоваться для ведения журнала как публичный статический финал с точки зрения производительности или иным образом?Это хорошая идея объявить, что весь текст будет использоваться для ведения журнала как открытый статический окончательный

Есть ли у него какие-либо преимущества, кроме чтения, если одна строка используется только один раз?

+1

Есть ли что-то неправильное в том, как я задал этот вопрос? Пожалуйста, предложите, я изменю его – Andy897

+0

«Строка, используемая для ведения журнала» - вы имеете в виду текстовые значения, используемые в качестве сообщений журнала? Если это так, на самом деле - найдите String константу интернирования в Java. – chrylis

+0

Да, вот что я имел в виду. Редактирование вопроса, чтобы сказать это явно. спасибо за комментарий – Andy897

ответ

2

Во-первых, объективная часть вашего вопроса: есть ли выигрыш в производительности от объявления бревенчатый о статические конечные, то есть:

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); 

Это гораздо быстрее и легче читать сообщения журнала в контексте кода, вместо того, чтобы прыгать куда-то в коде, чтобы увидеть полное сообщение журнала.

1

Простая интернационализация и локализация являются возможными преимуществами использования идентификаторов для строковых констант.

ResourceBundle bundle = ... 
private final static LOGIN_ERROR_OCCURRED = bundle.getString("Login failed for user {}; attempt {} of 5"); 

Но преимущества i18n/L10n для сообщений журнала могут быть сомнительными.

+0

Большое спасибо за ответ. Но я не понял его полностью, не могли бы вы его немного разобраться. – Andy897

+0

Интернационализация (часто сокращается как «i18n», потому что есть 18 букв между первой и последней буквами) делает вашу программу работы на разных языках. Локализация (или «L10n») расширяет ее до вариантов языков. Хорошая вещь, позволяющая вашей программе отображать сообщения и меню на языке пользователя. Журнальные сообщения, которые часто читаются разработчиками, могут не воспользоваться этим и могут сделать журнал бесполезным для разработчика, если они не смогут перевести его на свой язык. Опять же, некоторые программы разрабатываются международным сообществом. – AJNeufeld

+0

Отличная точка - интернационализация - это один из моментов, когда было бы разумно использовать идентификаторы. Я еще не работал над проектом, который выиграет от интернационализированных сообщений журнала, но это не значит, что их не существует. –

0

Ведомые строки почти наверняка не должны быть объявлены public, по крайней мере, обычно. В большинстве случаев лучше объявлять постоянные переменные для них, но иногда вы можете об этом не беспокоиться. Константы должны появляться вместе в верхней части исходного кода, поэтому для записи строк это дает хороший обзор того, что происходит в классе. Это также облегчает поиск их для обслуживания, например, для редактирования глупых посторонних восклицательных знаков. (Не смейтесь, я их видел.) Я не согласен с тем, что они затушевывают точку сообщений журнала, если вы не сосать имена переменных. Это слишком много людей.