Я пытаюсь создать перечисление, которое содержит строку регулярных выражений, убедившись, что шаблон только компилируется один раз, потому что pattern compilation is expensive, и я многократно использую тот же шаблон. Я пытаюсь создать динамически скомпилированный объект Pattern в зависимости от выбранного типа перечисления. Однако я застрял в следующем. Можете ли вы любезно предоставить некоторые рекомендации или предложить лучший способ добиться этого?Java - regex pattern compilation best practice (with enum)
public enum LOG_SCANNER{
FOO_STRING(".*XXXX$"),
BAR_STRING(".*YYYY.*"),
;
static Pattern p;
static {
p = Pattern.compile(regex); // Compilation failes here
}
String regex;
private LOG_NAME_MATCHER(String regex) {
this.regex = regex;
}
}
редактировать: Пожалуйста, обратите внимание, что я не использую регулярное выражение для поиска чего-то, что может быть достигнуто с String.endsWith() или .Contains(). (". * XXXX $") является просто примером.
Помимо устранения проблем с компиляцией, ознакомьтесь с http://stackoverflow.com/questions/2423376/java-initialization-order-issue-static-vs-instance-fields и смежными вопросами. –
Вы слишком задумываетесь об этом. Если вы используете один и тот же шаблон много раз, поместите его в отдельный класс utils/константы, а затем используйте его. – TheLostMind
@ TheLostMind На самом деле, это слишком завышено. Хорошее слово! – laune