2008-08-10 24 views
6

Tôi là thành viên của một nhóm phát triển một Swing Java Applet khá lớn. Hầu hết các mã của chúng tôi là di sản và có rất nhiều tài liệu tham khảo singleton. Chúng tôi đã gom tất cả chúng vào một single "Application Context" đơn. Điều chúng ta cần bây giờ là tạo ra một số cách để phân tách bối cảnh chia sẻ (được chia sẻ trên tất cả các applet hiện đang hiển thị) và ngữ cảnh không chia sẻ (cụ thể cho mỗi applet hiện đang hiển thị).Làm cách nào để tôi có thể xác định ngữ cảnh Java Applet đang chạy mà không cần chuyển ID?

Tuy nhiên, chúng tôi không có ID tại mỗi địa điểm gọi đến singleton, cũng như chúng tôi không muốn truyền ID đến tất cả các địa điểm. Cách dễ nhất để xác định ngữ cảnh applet mà chúng ta đang chạy là gì? (Tôi đã cố gắng rối tung với các bộ nạp lớp, các nhóm luồng, id chủ đề ... cho đến nay tôi không thể tìm thấy gì sẽ cho phép tôi ID nguồn gốc của cuộc gọi).

Trả lời

2

Độc thân là ác, bạn mong đợi điều gì? ;)

Có lẽ cách tiếp cận toàn diện nhất sẽ là tải phần lớn của applet trong trình tải lớp khác (sử dụng java.net.URLClassLoader.newInstance). Sau đó sử dụng WeakHashMap để kết hợp bộ nạp lớp với một applet. Nếu bạn có thể chia hầu hết mã thành một trình nạp lớp phổ biến (làm cha mẹ của mỗi trình nạp lớp cho từng ứng dụng) và vào trong codebase applet bình thường, điều đó sẽ nhanh hơn nhưng hiệu quả hơn.

hacks khác:

Nếu bạn có quyền truy cập vào bất kỳ thành phần, bạn có thể sử dụng nhiều lần hoặc Component.getParent SwingUtilities.getRoot.

Nếu bạn đang ở trong một chuỗi ví dụ cho mỗi ứng dụng, thì bạn có thể thiết lập một ThreadLocal.

Từ EDT, bạn có thể đọc sự kiện hiện tại từ hàng đợi (java.awt.EventQueue.getCurrentEvent()) và có thể tìm thấy một thành phần từ đó. Ngoài ra, hãy đẩy EventQueue bằng phương thức dispatchEvent được ghi đè.

+0

Đây là (cho đến nay) bộ sưu tập các ý tưởng tốt nhất mà tôi đã thấy về chủ đề này. Tôi đặc biệt thích "đẩy một eventqueue tùy chỉnh" - và tôi sẽ thử nó. –

0

Nếu tôi hiểu chính xác bạn, ý tưởng là để có được một đối tượng "singleton" khác nhau cho từng đối tượng người gọi hoặc "ngữ cảnh". Một điều bạn có thể làm là tạo một biến toàn cầu theo chuỗi địa phương nơi bạn viết ID của ngữ cảnh hiện tại. (Điều này có thể được thực hiện với AOP.) Sau đó, trong getleton singleton, ID ngữ cảnh được lấy từ thread-local để sử dụng như là một khóa để thể hiện "singleton" chính xác cho ngữ cảnh gọi.

Về AOP, sẽ không có vấn đề gì khi sử dụng nó trong các applet, tùy thuộc vào các điểm cắt của bạn, các lời khuyên được dệt tại thời gian biên dịch và một JAR được thêm vào các phụ thuộc thời gian chạy. Do đó, không có bằng chứng đặc biệt về AOP nên duy trì trong thời gian chạy.

0

@Hugo về ThreadLocal:

Tôi nghĩ về giải pháp đó. Tuy nhiên, từ thử nghiệm, tôi đã tìm thấy hai vấn đề với cách tiếp cận đó:

  1. Chủ đề được chia sẻ (kết nối máy chủ, v.v.) có vấn đề. Điều này có thể được giải quyết mặc dù bằng cách đặc biệt chú ý đến các chủ đề này (tất cả chúng đều nằm dưới sự kiểm soát của tôi và được phân lập khá nhiều từ mã kế thừa).
  2. Chuỗi EDT được chia sẻ trên tất cả các applet. Tôi đã không tìm được cách để tạo ra một chuỗi EDT mới cho mỗi applet. Điều này có nghĩa rằng threadlocal cho EDT sẽ được chia sẻ trên các applet. Điều này tôi không có ý tưởng làm thế nào để giải quyết. Gợi ý?
+0

Bạn sẽ có thể nhận chuỗi chủ đề mới bằng cách sử dụng một giá trị khác cho thẻ lưu trữ.Tôi nghĩ rằng bạn chỉ có thể thêm một tên jar ngẫu nhiên vào cuối ngay cả khi nó tồn tại. –

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