Java normal ifade kalıpları - zaman sabitleri veya örnek üyeleri derlemek?


13

Şu anda, düzenli ifadelerde eşleştirme yaptığım tekli nesnelerim var ve s'lerPattern şöyle tanımlanıyor:

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

Ama geçen gün birisi tarafından bunun kötü bir stil olduğu ve her zaman sınıf düzeyinde tanımlanması ve bunun yerine şöyle görünmesi Patterngerektiği söylendi :

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

Bu özel nesnenin ömrü o kadar uzun değil ve ilk yaklaşımı kullanmamın temel nedeni Pattern, nesne GC'ye ulaştığında s'ye tutunmamın mantıklı olmaması .

Herhangi bir öneriniz / düşünceniz var mı?

Yanıtlar:


18

Java Pattern nesneleri iş parçacığı için güvenli ve değişmezdir (iş parçacığı için güvenli olmayan eşleştiriciler).

Bu nedenle , sınıfın her örneği (veya yine sınıftaki başka bir yöntemde) tarafından kullanılacaklarsa bunları yapmamaları için hiçbir neden yoktur static.

Yaşam süreleri ne kadar kısa (veya uzun) olursa olsun, bunları örnek değişkenleri yapmak, her sınıf örneği oluşturduğunuzda normal ifadeyi yeniden derlediğiniz anlamına gelir.

Bu yapının temel nedenlerinden biri (Pattern, Matcher nesneleri için bir fabrika olmaktır), düzenli ifadeyi sonlu otomata derlemenin orta derecede pahalı bir eylem olmasıdır. Bununla birlikte, belirli bir sınıfta sıklıkla aynı düzenli ifadenin tekrar tekrar kullanıldığını (aynı yöntemin birden fazla çağrılması veya sınıftaki farklı noktalar aracılığıyla) bulur.

Öte yandan, Eşleştirici oldukça hafiftir - Desen içindeki desenin durumunu ve dizenin karakter dizisi içindeki konumu gösterir.


Bir singleton için çok önemli değil , çünkü sonuçta, etrafta oturan tek bir örneği var ve singletonu tekrar tekrar yaratmıyorsunuz (bekleyin, 'singletonun ömrü o kadar uzun değil') ? Eğer bu ne anlama mu edilir uygulamanın boyunca bunu birden çok kez başlatmasını?)

Bununla birlikte, bazı statik kaynak kodu analizörlerinin bir şeyin tekil olduğunu tanımadığını ve sınıfın her örneği için sabitlerden desen örnekleri oluşturduğunuzdan şikayet edeceğinizi göreceksiniz.

Tüm bu sorun iyi değil (onun bir tekton için ya da kötü değil) bir seçim ve derleyici ve analiz araçları size anlattığı şeyler (diğer kırık pencereler hakkında daha fazla bilgi ) göz ardı etmeye başlayabilirsiniz .

İlişkili:


Müthiş cevap - evet, sadece bir kez yaratıldığı / kullanıldığı anlamına geliyordu ve bir kez kapsam dışında kaldığında iyi için yapılıyor. Takip okuması için teşekkürler!
yamafontes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.