Pola regex Java - kompilasi konstanta waktu atau anggota instance?

13

Saat ini, saya memiliki beberapa objek tunggal di mana saya melakukan pencocokan pada ekspresi reguler, dan Patterns saya didefinisikan seperti:

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 */ }
}

Tapi saya diberitahu oleh seseorang tempo hari bahwa ini adalah gaya yang buruk, dan Patterns harus selalu didefinisikan di tingkat kelas, dan terlihat seperti ini sebagai gantinya:

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 */ }
}

Masa pakai objek khusus ini tidak terlalu lama, dan alasan utama saya untuk menggunakan pendekatan pertama adalah karena tidak masuk akal bagi saya untuk berpegang pada Patterns begitu objek mendapat GC.

Ada saran / pemikiran?

yamafontes
sumber

Jawaban:

18

Objek Pola Java aman dan tidak dapat diubah (ini adalah pencocokannya yang tidak aman untuk thread).

Dengan demikian, tidak ada alasan untuk tidak membuatnya staticjika mereka akan digunakan oleh setiap instance kelas (atau lagi dalam metode lain di kelas).

Membuat mereka variabel instan, tidak peduli seberapa pendek (atau panjang) waktu hidup mereka berarti Anda mengkompilasi ulang ekspresi reguler setiap kali Anda membuat instance kelas.

Salah satu alasan utama untuk struktur ini (Pola menjadi pabrik untuk objek Matcher) adalah bahwa mengkompilasi ekspresi reguler ke automata terbatasnya adalah tindakan yang cukup mahal. Namun, orang menemukan bahwa sering kali ekspresi reguler yang sama digunakan berulang kali di kelas yang diberikan (baik melalui banyak pemanggilan metode yang sama atau tempat yang berbeda di kelas).

Matcher, di sisi lain agak ringan - itu menunjuk ke keadaan pola dalam Pola dan lokasi dalam array karakter untuk string.


Untuk seorang lajang , seharusnya tidak terlalu banyak masalah, karena bagaimanapun, hanya ada satu contoh dari itu yang duduk di sekitar dan Anda tidak menciptakan singleton lagi dan lagi (tunggu, 'masa hidup dari singleton tidak terlalu lama' ? Apakah ini berarti Anda sedang instantiating beberapa kali selama aplikasi?)

Namun, Anda akan menemukan bahwa beberapa penganalisa kode sumber statis tidak mengenali bahwa ada sesuatu yang tunggal dan akan mengeluh bahwa Anda membuat contoh pola dari konstanta untuk setiap instance kelas.

Masalah dengan semua ini adalah bahwa itu adalah pilihan yang tidak baik (itu tidak buruk untuk seorang singleton baik) dan Anda mungkin mulai mengabaikan peringatan lain untuk hal-hal yang memberitahu Anda tentang kompiler dan alat analisis (baca lebih lanjut tentang jendela pecah ).

Terkait:

Komunitas
sumber
Jawaban yang luar biasa - ya, maksud saya itu hanya pernah dibuat / digunakan sekali, dan setelah keluar dari ruang lingkup itu dilakukan untuk selamanya. Terima kasih telah membaca!
yamafontes