2011-05-19 38 views
18

Trong this video from Google IO 2009, người trình bày rất nhanh chóng nói rằng chữ ký của phương pháp nên trả về loại bê tông thay vì giao diện.Trong GWT, tại sao một phương thức không trả về một giao diện?

Từ những gì tôi đã nghe trong video, điều này có liên quan đến trình biên dịch Java-to-Javascript GWT.

  • Lý do đằng sau lựa chọn này là gì?
  • Giao diện trong chữ ký phương thức làm gì với trình biên dịch?
  • Phương pháp nào có thể trả về giao diện thay vì các loại bê tông và các phương thức nào tốt hơn khi trả về các trường hợp cụ thể?

Snippet of code from Google IO presentation showing it's better that your method returns ArrayList than List

+0

Nó có liên quan đến việc tuần tự hóa RPC. Xem http://stackoverflow.com/questions/3059787/gwt-using-listserializable-in-a-rpc-call –

+0

Nhìn vào hoặc ngay sau điểm 7 phút trong bản trình bày. Người nói không biết chính xác lý do tại sao anh ấy làm điều đó.Anh gọi nó là "mê tín dị đoan". –

Trả lời

16

này đã làm với các gwt-biên dịch, như bạn nói một cách chính xác. EDIT: Tuy nhiên, như Daniel lưu ý trong một bình luận dưới đây, điều này không áp dụng cho trình biên dịch gwt nói chung nhưng chỉ khi sử dụng GWT-RPC.

Nếu bạn khai báo Danh sách thay vì ArrayList làm kiểu trả về, trình biên dịch gwt sẽ bao gồm toàn bộ Danh sách phân cấp (nghĩa là tất cả các loại thực hiện Danh sách) trong mã được biên dịch của bạn. Nếu bạn sử dụng ArrayList, trình biên dịch sẽ chỉ cần bao gồm hệ thống phân cấp ArrayList (tức là tất cả các kiểu thực hiện ArrayList - thường chỉ là bản thân ArrayList). Sử dụng một giao diện thay vì một lớp cụ thể, bạn sẽ phải trả một hình phạt về thời gian biên dịch và kích thước của mã được tạo ra của bạn (và do đó số lượng mã mà mỗi người dùng phải tải xuống khi chạy ứng dụng của bạn).

Bạn cũng hỏi lý do: Nếu bạn sử dụng giao diện (thay vì một lớp cụ thể), trình biên dịch không biết thời gian biên dịch mà việc triển khai các giao diện này sẽ được sử dụng. Vì vậy, nó bao gồm tất cả các triển khai có thể.

Về câu hỏi cuối cùng của bạn: tất cả các phương thức CÓ THỂ được khai báo để trả về giao diện (đó là những gì bạn đề cập, đúng không?). Tuy nhiên, hình phạt trên được áp dụng.

Và nhân tiện: Theo tôi hiểu, vấn đề này không bị hạn chế đối với phương pháp. Nó áp dụng cho tất cả các khai báo kiểu: biến, tham số. Bất cứ khi nào bạn sử dụng một giao diện để khai báo một cái gì đó, trình biên dịch sẽ bao gồm hệ thống phân cấp hoàn chỉnh của các giao diện con và các lớp thực hiện. (Vì vậy, rõ ràng nếu bạn khai báo giao diện của riêng bạn chỉ với một hoặc hai lớp thực hiện thì bạn không phải chịu một hình phạt lớn. Đó là cách tôi sử dụng giao diện trong GWT.)

Tóm lại: sử dụng các lớp cụ thể bất cứ khi nào có thể. (. Đề nghị nhỏ: nó sẽ giúp đỡ nếu bạn đã cho dấu thời gian khi bạn tham khảo video)

+7

bloat mã chỉ dành cho các lớp được sử dụng với quá trình tạo mã (ví dụ: GWT-RPC). Nói chung trình biên dịch KHÔNG sưng lên khi sử dụng giao diện –

+0

** Daniel, bạn nói đúng! ** Tôi hoàn toàn quên rằng người ta có thể sử dụng GWT mà không cần GWT-RPC. – Stefan

+0

@danielkurka - Bạn có biết liệu bloat giao diện GWT-RPC này có còn là vấn đề trong các phiên bản GWT mới hơn không? –

2

này và mẹo hiệu suất khác đã được trình bày tại Google IO 2011 - High-performance GWT.

Vào khoảng điểm 7 phút sự nói địa chỉ 'RPC Loại nổ': #4 Watch out for RPC type explosion

Đối với một số lý do tôi nghĩ trình biên dịch GWT sẽ tối ưu hóa nó đi một lần nữa nhưng dường như tôi đã nhầm lẫn.

+0

Điều này vẫn đúng với 2.8.0? – displayname

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