Tôi gặp vấn đề về thiết kế trong một tiện ích chung mà chúng tôi sử dụng trong dự án Java của chúng tôi nơi tôi muốn đảm bảo rằng tất cả người gọi của một phương pháp cụ thể A được bao bọc bởi phương pháp khác B. Dạng chung của mã này như tôi đã viết hôm nay là:đảm bảo ngăn xếp cuộc gọi của một phương thức luôn bao gồm một phương thức khác trong Java
x.B(new Runnable() {
y.A();
});
Runnable đang được B thực hiện có thể có mã tùy ý, và có thể gọi A nhiều lần, vì vậy tôi không thể loại bỏ các runnable trong mã này bằng cách thêm các cuộc gọi đến A trực tiếp vào B. Ngoài ra, A là mã của bên thứ ba, vì vậy chúng tôi không thể sửa đổi nó. Có thể là runnable có thể gọi B một lần nữa với một cuộc gọi lồng nhau đến A, nhưng hôm nay điều đó không bao giờ xảy ra vì vậy tôi ok bỏ qua trường hợp đó ngay bây giờ.
Tôi thấy một vài lựa chọn:
- Khai
A() throws BlahException
và làm cho nó để B là catcher duy nhất của ngoại lệ đó. Điều này là xấu bởi vì không có bất kỳ ngoại lệ nào nên thực sự được ném, nhưng nó tốt đẹp bởi vì trình biên dịch sẽ đảm bảo phân cấp cuộc gọi cho tôi. - Viết một số loại công cụ phân tích tĩnh để đảm bảo quy tắc này cho tôi. Tôi đã không điều tra trường hợp này nhiều, nhưng nó có vẻ như công việc nhiều hơn bất cứ điều gì khác (nhưng có thể có một công cụ từ trước có thể làm điều này?).
- Thêm xác nhận vào "đầu A" (thực sự, mã này sẽ phải hoạt động trong phiên bản Runnble tùy chỉnh vì tôi không thể sửa đổi trực tiếp) mà chúng tôi đang chạy bên trong cuộc gọi đến B. Điều này có thể hoặc sử dụng một số trạng thái thread-/object-local bổ sung hoặc duyệt qua ngăn xếp cuộc gọi, cả hai đều xấu xí.
Có các tùy chọn nào khác mà tôi chưa xem xét không?
Đây là một mô hình rất chống. Phương pháp 'A' không nên quan tâm ai gọi nó. Tại sao bạn nghĩ rằng bạn cần phải làm điều này? –
Bạn đã thử sử dụng mẫu Proxy chưa? – MaxZoom
@KevinKrumwiede - Có thể cho cả hai 'A' là bất khả tri của người gọi của nó và dự án muốn tất cả các cuộc gọi đến' A' được bao bọc. –