Шаблони регулярного вираження Java - компілювати постійні часу або члени екземпляра?


13

В даний час у мене є кілька однотонних об'єктів, де я співставляю регулярні вирази, і мої Patterns визначаються так:

class Foobar {
  private final Pattern firstPattern =
    Pattern.compile("some regex");
  private final Pattern secondPattern =
    Pattern.compile("some other regex");
  // more Patterns, etc.
  private Foobar() {}
  public static Foobar create() { /* singleton stuff */ }
}

Але мені днями хтось сказав, що це поганий стиль, і Patterns завжди слід визначати на рівні класу, а натомість виглядати приблизно так:

class Foobar {
  private static final Pattern FIRST_PATTERN =
    Pattern.compile("some regex");
  private static final Pattern SECOND_PATTERN =
    Pattern.compile("some other regex");
  // more Patterns, etc.
  private Foobar() {}
  public static Foobar create() { /* singleton stuff */ }
}

Термін експлуатації цього конкретного об'єкта не такий довгий, і моя основна причина використання першого підходу полягає в тому, що мені не має сенсу триматися на Patterns, як тільки об’єкт отримує GC'd.

Будь-які пропозиції / думки?

Відповіді:


18

Об'єкти Java Pattern є потоковими та незмінними (це відповідники, які не є безпечними для потоків).

Таким чином, немає причин не робити їх, staticякщо вони збираються використовувати кожен екземпляр класу (або знову ж таки в іншому методі в класі).

Створення їх змінних примірників, незалежно від того, наскільки короткий (або тривалий) їхній час життя означає, що ви перекомпілюєте регулярний вираз кожен раз, коли створюєте екземпляр класу.

Однією з ключових причин цієї структури («Шаблон є фабрикою об’єктів Matcher») є те, що компіляція регулярного виразу в його кінцеві автомати є надзвичайно дорогою дією. Однак можна виявити, що часто той самий регулярний вираз використовується знову і знову в даному класі (або через кілька викликів одного методу або через різні плями в класі).

Матч, з іншого боку, досить легкий - він вказує на стан шаблону в межах Шаблону та на розташування в масиві символів для рядка.


Для одноелементні , він повинен не має значення надто багато, тому що в кінці кінців, є тільки один екземпляр цього , який сидить навколо , і ви не відтворювати одноплодной знову і знову (очікування, «термін служби Сінглтона не так довго» ? чи означає це , ви є інстанцірованія його кілька разів протягом програми?)

Однак ви виявите, що деякі статичні аналізатори вихідного коду не визнають, що щось є однотонним, і будуть скаржитися на те, що ви створюєте екземпляри шаблонів із констант для кожного примірника класу.

Проблема у всьому цьому полягає в тому, що це не гарний (це не погано і для однотонної) вибір, і ви можете почати ігнорувати інші попередження щодо речей, про які вам говорять компілятор та інструменти аналізу (читайте докладніше про розбиті вікна ).

Пов'язані:


Дивовижна відповідь - так, я мав на увазі, що коли-небудь створений / використаний один раз, і як тільки він вийде за межі, це робиться на благо. Дякуємо за наступне читання!
yamafontes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.