Các mẫu biểu thức chính quy Java - các hằng số thời gian biên dịch hoặc các thành viên thể hiện?


12

Hiện tại, tôi có một vài đối tượng đơn lẻ trong đó tôi đang kết hợp các biểu thức chính quy và các đối tượng của tôi Patternđược định nghĩa như vậy:

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

Nhưng một người khác đã nói với tôi vào một ngày khác rằng đây là phong cách tồi tệ và Patterns luôn phải được xác định ở cấp độ lớp và trông giống như thế này:

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

Thời gian tồn tại của đối tượng cụ thể này không dài như vậy và lý do chính của tôi khi sử dụng cách tiếp cận đầu tiên là vì tôi không có ý nghĩa gì với việc giữ lấy Patternnó một khi đối tượng bị GC'd.

Bất kỳ đề xuất / suy nghĩ?

Câu trả lời:


17

Các đối tượng Mẫu Java là luồng an toàn và không thay đổi (các đối sánh không phải là luồng an toàn).

Như vậy, không có lý do gì để không tạo ra chúng staticnếu chúng sẽ được sử dụng bởi mỗi phiên bản của lớp (hoặc một lần nữa trong một phương thức khác trong lớp).

Biến chúng thành các biến đối tượng, bất kể thời gian sống của chúng ngắn (hoặc dài) có nghĩa là bạn đang biên dịch lại biểu thức chính quy mỗi khi bạn tạo một thể hiện của một lớp.

Một trong những lý do chính cho cấu trúc này (Mẫu là một nhà máy cho các đối tượng Matcher) là việc biên dịch biểu thức chính quy thành automata hữu hạn của nó là một hành động đắt tiền vừa phải. Tuy nhiên, người ta thấy rằng thường cùng một biểu thức chính quy được sử dụng lặp đi lặp lại trong một lớp nhất định (thông qua nhiều cách gọi của cùng một phương thức hoặc các điểm khác nhau trong lớp).

Mặt khác, Matcher khá nhẹ - nó chỉ đến trạng thái của mẫu trong Mẫu và vị trí trong mảng ký tự cho chuỗi.


Đối với một người độc thân , điều đó không thành vấn đề quá nhiều, bởi vì sau tất cả, chỉ có một trường hợp duy nhất xảy ra xung quanh và bạn không tái tạo lại người độc thân hết lần này đến lần khác ? Điều này có nghĩa là bạn đang khởi tạo nó nhiều lần trong suốt quá trình của ứng dụng phải không?)

Tuy nhiên, bạn sẽ thấy rằng một số máy phân tích mã nguồn tĩnh không nhận ra rằng một cái gì đó là một singleton và sẽ phàn nàn rằng bạn đang tạo các thể hiện của các mẫu từ các hằng số cho mỗi phiên bản của lớp.

Vấn đề với tất cả những điều này là nó không phải là lựa chọn tốt (cũng không tệ đối với một người độc thân) và bạn có thể bắt đầu bỏ qua các cảnh báo khác cho những điều mà trình biên dịch và công cụ phân tích cho bạn biết (đọc thêm về các cửa sổ bị hỏng ).

Liên quan:


Câu trả lời tuyệt vời - vâng, ý tôi là nó chỉ được tạo / sử dụng một lần và một khi nó vượt ra khỏi phạm vi thì nó được thực hiện tốt. Cảm ơn đã theo dõi đọc!
yamafontes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.