2008-08-26 33 views
15

Tôi đang hợp nhất một chi nhánh CVS và một trong những thay đổi lớn hơn là thay thế bất cứ nơi nào nó xảy ra trong mẫu Singleton với các lớp trừu tượng có khối khởi tạo tĩnh và tất cả các phương thức tĩnh.Java Singleton vs static - có lợi ích thực sự thực sự không?

Đây có phải là thứ đáng để giữ vì nó sẽ yêu cầu sáp nhập rất nhiều xung đột, loại tình huống nào tôi sẽ xem xét cho việc tái cấu trúc này là đáng giá?

Chúng tôi đang chạy ứng dụng này theo WebLogic 8.1 (để JDK 1.4.2)


xin lỗi Thomas, hãy để tôi làm rõ ..

phiên bản TRỤ có Singleton pattern truyền thống (nhà xây dựng tư nhân, getInstance() v.v.)

phiên bản nhánh không có hàm tạo, là 'lớp trừu tượng công khai' và sửa đổi tất cả các phương thức trên đối tượng là 'tĩnh'. Mã được sử dụng để tồn tại trong hàm tạo riêng được chuyển vào một khối tĩnh.

Sau đó, tất cả các tập quán của lớp được thay đổi gây ra nhiều xung đột trong quá trình hợp nhất.

Có một vài trường hợp thay đổi này được thực hiện.

Trả lời

15

Từ quan điểm thực thi nghiêm ngặt về thời gian chạy, sự khác biệt thực sự không đáng kể. Sự khác biệt chính giữa hai nằm trong thực tế là vòng đời "tĩnh" được liên kết với trình nạp lớp, trong khi đối với singleton đó là vòng đời thường xuyên của cá thể. Thông thường tốt hơn là tránh xa hoạt động kinh doanh ClassLoader, bạn tránh một số vấn đề phức tạp, đặc biệt là khi bạn cố gắng tải lại ứng dụng web.

+1

Một singleton được gắn với tuổi thọ ClassLoader của trình nạp lớp đã tải nó, nhiều như tĩnh. –

+5

Và? Tất cả mọi thứ được gắn liền với tuổi thọ của ClassLoader, nhưng bằng cách đặt một singleton, bạn có thêm một lớp vòng đời, với nhiều cơ hội hơn (hoàn thiện) để xử lý mọi thứ một cách chính xác. –

0

Thảo luận này có hữu ích không? (Tôi không biết nếu đó là điều cấm kỵ để liên kết đến diễn đàn lập trình khác, nhưng tôi không muốn chỉ trích toàn bộ thảo luận =))

Sun Discussion on this subject

Bản án có vẻ là nó không làm đủ sự khác biệt về vật chất trong hầu hết các trường hợp, mặc dù về mặt kỹ thuật, các phương pháp tĩnh hiệu quả hơn.

3

Nếu bài đăng gốc của tôi là sự hiểu biết chính xác và thảo luận từ Sun được liên kết là chính xác (mà tôi nghĩ nó có thể), thì tôi nghĩ bạn phải giao dịch giữa sự rõ ràng và hiệu suất.

Hãy tự hỏi mình những câu hỏi sau:

  1. Liệu đối tượng Singleton làm những gì tôi đang làm rõ ràng hơn?
  2. Tôi có cần một đối tượng để thực hiện tác vụ này hay không phù hợp hơn với các phương pháp tĩnh không?
  3. Tôi có cần hiệu suất mà tôi có thể đạt được bằng cách không sử dụng Singleton không?
+0

Câu hỏi thực sự là về hiệu suất đạt được :-) Hãy xem xét bạn có một bộ điều khiển xử lý 100 yêu cầu mỗi giây. điều này có liên quan đến việc chọn giữa singleton hoặc lớp như một dịch vụ không quốc tịch không? – lisak

16

Tôi sẽ sử dụng một singleton nếu cần để lưu trữ bất kỳ trạng thái nào và các lớp tĩnh khác. Không có vấn đề gì trong việc khởi tạo một cái gì đó, ngay cả một trường hợp duy nhất, trừ khi nó cần lưu trữ một cái gì đó.

3

Từ kinh nghiệm của tôi, điều duy nhất quan trọng là việc thử nghiệm đơn vị nào dễ dàng hơn. Tôi luôn cảm thấy Singleton dễ dàng và tự nhiên hơn.Nếu tổ chức của bạn cho phép bạn sử dụng JMockit, điều đó không quan trọng vì bạn có thể khắc phục những lo ngại này.

11

Tĩnh không tốt cho khả năng mở rộng vì các phương thức và trường tĩnh không thể được mở rộng hoặc ghi đè bởi lớp con.

Cũng rất tệ đối với các bài kiểm tra đơn vị. Trong một bài kiểm tra đơn vị, bạn không thể giữ lại các tác dụng phụ của các bài kiểm tra khác nhau từ khi bạn không thể kiểm soát trình nạp lớp. Các trường tĩnh được khởi tạo trong một thử nghiệm đơn vị sẽ được hiển thị trong một thử nghiệm khác hoặc tệ hơn, chạy thử nghiệm đồng thời sẽ mang lại kết quả không thể đoán trước.

Singleton thường là mẫu ok khi được sử dụng một cách tiết kiệm. Tôi thích sử dụng một khung DI và cho phép quản lý các trường hợp của tôi cho tôi (có thể trong phạm vi khác nhau, như trong Guice).

0

Viết một số mã để đo hiệu suất. Câu trả lời sẽ phụ thuộc vào JVM (JDK của Sun có thể thực hiện khác với JRockit) và các cờ VM mà ứng dụng của bạn sử dụng.

Các vấn đề liên quan