2010-05-15 47 views
5

Đây có thể là một câu hỏi khá chủ quan, nhưng có thể không. Ứng dụng của tôi chứa một loạt các biểu mẫu được hiển thị cho người dùng vào các thời điểm khác nhau. Mỗi hình thức là một lớp của riêng nó. Thông thường, người dùng nhấp vào một nút, sẽ ra mắt một biểu mẫu mới.Sự phù hợp phản chiếu Java

Tôi có một chức năng tiện lợi mà xây dựng các nút này, bạn gọi nó như thế này:

buildButton("button text", new SelectionAdapter() { 
    @Override 
    public void widgetSelected(SelectionEvent e) { 
     showForm(new TasksForm(args...)); 
    } 
    }); 

tôi làm hàng chục này lần, và nó thực sự cồng kềnh phải thực hiện một SelectionAdapter mỗi lần.

Thật tất cả những gì cần cho các nút để biết là những gì lớp để nhanh chóng khi được nhấp vào và những gì đối số để cung cấp cho các nhà xây dựng, vì vậy tôi đã xây dựng một chức năng mà tôi gọi như thay vì điều này:

buildButton("button text", TasksForm.class, args...); 

đâu args là một danh sách các đối tượng tùy ý mà bạn có thể sử dụng để khởi tạo TasksForm bình thường.

Nó sử dụng sự phản chiếu để có được một hàm tạo từ lớp, khớp với danh sách đối số và xây dựng một cá thể khi cần. Hầu hết thời gian tôi không phải truyền bất kỳ đối số nào cho hàm tạo. Nhược điểm là rõ ràng rằng nếu tôi đang đi qua một bộ xấu của các đối số, nó không thể phát hiện rằng tại thời gian biên dịch, vì vậy nếu nó không thành công, một hộp thoại sẽ được hiển thị trong thời gian chạy. Nhưng nó sẽ không bình thường thất bại, và nó sẽ được dễ dàng để gỡ lỗi nếu nó.

Tôi nghĩ rằng điều này là sạch hơn nhiều vì tôi đến từ các ngôn ngữ mà việc sử dụng hàm và lớp học là khá phổ biến. Nhưng nếu bạn là một lập trình viên Java bình thường, sẽ thấy điều này khiến bạn băn khoăn, hoặc bạn sẽ đánh giá cao việc không phải quét hàng triệu chương trình lựa chọn?

+0

Tôi sẽ phản ánh. –

Trả lời

3

Vâng, thường phản ánh được cau mày nhưng trong một số trường hợp, nó có thể khá hữu ích. Tôi sẽ đánh giá cao đọc mã mà tôi có thể tiêu hóa khá nhanh chóng mà không cần phải đi qua một thingies zillion chút.

0

Vấn đề không phải là sự phản ánh. Các khung công tác hiện đại sử dụng sự phản chiếu mọi lúc. Và nó là hip để sử dụng chú thích để làm tất cả mọi thứ, thường đòi hỏi sự phản chiếu.

Tuy nhiên, trong trường hợp của bạn, tại sao không bạn chỉ cần làm:

buildButton("button text", 
     new SelectionAdapterImplementation(new TaskForm(args))) 

trừ lớp ẩn danh của bạn được sử dụng các biến thức từ phạm vi, tôi thấy không có lý do.

+0

Nếu tôi hiểu bạn một cách chính xác, bạn đang đề xuất không sử dụng các lớp ẩn danh, trong trường hợp đó tôi phải xây dựng một triển khai SelectionAdapter cho mọi lớp mà tôi muốn khởi tạo. Thật không may, tôi có hàng chục người trong số họ (TasksForm chỉ là một ví dụ.) Có vẻ thậm chí còn lộn xộn hơn với tôi, nhưng có lẽ tôi là sự hiểu lầm. – jsn

+0

Ok, bạn nói đúng. Đi với sự phản ánh sau đó, hoặc vượt qua đối tượng TaskForm thay thế. – Artefacto

+0

Tôi đã chỉnh sửa bài đăng cho phù hợp. – Artefacto

0

Bạn đã sửa đổi buildButton(String, SelectionAdapter) để tham gia lớp học mà bạn sẽ phản ánh. Tôi thu thập rằng bây giờ bạn đang tạo ra một mới SelectionAdapter trong phương pháp đã sửa đổi của bạn và sau đó phản ánh trên tên lớp, tạo một thể hiện và chuyển nó vào showForm(arg). Tôi nghĩ rằng đây là một bước xa hơn bạn cần phải đi.

Thay vào đó, bạn có thể yêu cầu bản sao của bất kỳ lớp nào mà yêu cầu showForm(arg) yêu cầu. Điều quan trọng là phải lập luận rằng final trong arglist của bạn cho buildButton và bạn sẽ có thể sử dụng nó trong lớp ẩn danh của mình.

+1

Vì biểu mẫu là một thành phần giao diện người dùng, tôi không thể khởi tạo nó khi tôi xây dựng nút, tôi phải chờ cho đến khi nút được bấm, do đó, SelectionAdapter – jsn

0

Một cách khác là có phương pháp tĩnh trong mỗi biểu mẫu trả về nút tạo biểu mẫu. Nhưng sự phản chiếu có lẽ sẽ tốt hơn.

1

Nếu tôi hiểu chính xác, bạn muốn thực hiện một thao tác (createButton) với các kiểu triển khai nút (biểu mẫu) khác nhau cho đối số. Điều này nghe có vẻ giống như bạn cần đa hình.

Tôi đề nghị bạn quên phản ánh và tạo các biểu mẫu này trong một giao diện chung. Giả sử interface Form { //some methods here }

Tất cả biểu mẫu của bạn sẽ phải triển khai giao diện chung và các phương pháp này là bắt buộc để tạo nút. Vì vậy, nếu bạn có một đối tượng Form, bạn có thể vượt qua nó để createButton(Form formObject){...}

NẾU tất cả SelectionAdapter không là gọi một phương thức showForm, bạn có thể thêm nó vào chung interface Form và chỉ cần gọi phương pháp này cho một đối tượng Form. Vì vậy, bạn không cần phải tạo nhiều lớp ẩn danh mà chỉ cần một và khởi tạo nó với một đối tượng "Form".

Vì vậy, tất cả những gì bạn cần là tính đa hình và giao diện được lựa chọn độc đáo cho các lớp này.

Nếu bạn có vấn đề lớn với việc tạo các đối tượng Biểu mẫu (các hàm tạo khác nhau), có thể bạn nên xem xét việc tạo một MyFormBuilder chỉ xử lý việc xây dựng. Người xây dựng sẽ có phương thức createInstance() hoặc phương pháp getInstance() sẽ thực hiện tất cả công việc.

Với đề xuất của mình, bạn sẽ có 1 lớp triển khai lớp SelectionAdapter, bạn sẽ chuyển đối tượng với giao diện chung và sẽ tránh được sự phản chiếu, chuyển đối số MyClass.class và vv.

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