รูปแบบ Java regex - ค่าคงที่เวลารวบรวมหรือสมาชิกอินสแตนซ์?


13

ขณะนี้ฉันมีวัตถุซิงเกิลสองสามตัวที่ฉันจับคู่กับนิพจน์ทั่วไปและคำPatternนิยามของฉันเป็นดังนี้:

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

แต่ผมก็บอกคนในวันอื่น ๆ ที่ว่านี้เป็นรูปแบบที่ไม่ดีและPatternควรเสมอจะกำหนดไว้ในระดับชั้นเรียนและสิ่งที่มีลักษณะเช่นนี้แทน:

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 เป็นเธรดที่ปลอดภัยและไม่เปลี่ยนรูป (เป็นคู่ที่ไม่ปลอดภัยเธรด)

ดังนั้นจึงไม่มีเหตุผลที่จะไม่ทำให้พวกเขาstaticถ้าพวกเขาจะถูกใช้โดยแต่ละตัวอย่างของชั้นเรียน (หรืออีกครั้งในวิธีอื่นในชั้นเรียน)

ทำให้พวกเขามีตัวแปรอินสแตนซ์ไม่ว่าเวลาชีวิตของพวกเขาจะสั้นแค่ไหน (หรือยาว) หมายความว่าคุณกำลังคอมไพล์นิพจน์ปกติทุกครั้งที่คุณสร้างอินสแตนซ์ของคลาส

หนึ่งในเหตุผลสำคัญสำหรับโครงสร้างนี้ (รูปแบบเป็นโรงงานสำหรับวัตถุของ Matcher) คือการรวบรวมนิพจน์ปกติลงในออโตไฟไนต์ของมันเป็นการกระทำที่มีราคาแพงพอสมควร อย่างไรก็ตามพบว่าบ่อยครั้งที่การแสดงออกปกติเดียวกันถูกนำมาใช้ซ้ำแล้วซ้ำอีกในชั้นเรียนที่กำหนด (ไม่ว่าจะผ่านการเรียกใช้หลายวิธีที่เหมือนกันหรือจุดที่แตกต่างกันในชั้นเรียน)

Matcher ตรงกันข้ามจะค่อนข้างเบา - ชี้ไปที่สถานะของลวดลายภายใน Pattern และตำแหน่งภายในอาร์เรย์อักขระสำหรับสตริง


สำหรับซิงเกิลมันไม่สำคัญมากนักเพราะหลังจากนั้นมีเพียงตัวอย่างเดียวเท่านั้นที่อยู่รอบ ๆ และคุณไม่ได้สร้างซิงเกิลใหม่ซ้ำแล้วซ้ำอีก (รอ 'อายุการใช้งานของซิงเกิลนั้นไม่นาน' หมายความว่าคุณกำลังอินสแตนซ์มันหลายครั้งตลอดระยะเวลาของแอปพลิเคชัน?)

อย่างไรก็ตามคุณจะพบว่ามีนักวิเคราะห์ซอร์สโค้ดแบบสแตติกบางคนไม่ทราบว่ามีบางอย่างเป็นซิงเกิลตันและจะบ่นว่าคุณกำลังสร้างอินสแตนซ์ของรูปแบบจากค่าคงที่สำหรับแต่ละอินสแตนซ์ของคลาส

ปัญหาทั้งหมดนี้คือมันเป็นตัวเลือกที่ไม่ดี (มันก็ไม่ได้แย่สำหรับซิงเกิลตัน) และคุณอาจเริ่มมองข้ามคำเตือนอื่น ๆ สำหรับสิ่งต่าง ๆ ที่คอมไพเลอร์และเครื่องมือวิเคราะห์บอกคุณ (อ่านเพิ่มเติมเกี่ยวกับหน้าต่างที่แตก )

ที่เกี่ยวข้อง:


คำตอบที่ยอดเยี่ยม - ใช่ฉันหมายถึงมันเคยสร้าง / ใช้ครั้งเดียวและเมื่อมันเกินขอบเขตมันก็ทำออกมาได้ดี ขอบคุณสำหรับการติดตามการอ่าน!
yamafontes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.