2012-03-10 17 views
5

Tôi có xu hướng sử dụng (hoặc thậm chí lạm dụng) đôi niềng răng đối tượng intialization trong GWT. Đối với tôi, nó trông dễ đọc hơn và dễ hiểu hơn.Làm thế nào có hại là đôi niềng răng trong GWT?

new FastMap<Object>(){{ 
    put("Value", 12); 
    put("Unit", "Kg"); 
}}; 

Trước ngày hôm nay, tôi không biết rằng cú pháp này không chỉ là đối tượng khởi tạo mà còn tạo AnonymousInnerClass for it. Bây giờ tôi lo ngại cách GWT đối phó với họ.

  1. Cú pháp này ảnh hưởng đến hiệu suất thực thi như thế nào?
  2. Cú pháp này ảnh hưởng đến kích thước được biên dịch như thế nào?
  3. Bất kỳ điều xấu nào khác?

Tôi có hàng nghìn lần khởi tạo như vậy trong ứng dụng của mình.

+0

câu hỏi hay. Hãy thử biên dịch với _-style = PRETTY_, điều này có thể làm sáng tỏ. –

Trả lời

5

Phát hiện của tôi. Kiểm tra code. Tôi đang tạo danh sách duy nhất với 4 bản đồ với 21 mục. Tôi đang đo kích thước của tất cả các tệp JavaScript được tạo.Kết quả:

rỗng (chỉ là mã sản phẩm nào để đảm bảo rằng GWT mã hỗ trợ render):

  • PRETTY = 533 KB (546 602 bytes)
  • OBF = 212 KB (217 601 bytes)
  • số new = 167

mà không cần niềng răng đôi:

  • PRETTY = 557 KB (570 682 bytes)
  • OBF = 222 KB (227 663 bytes)
  • Số new = 171

Và cùng một mã với niềng răng đôi:

  • PRETTY = 567 KB (581 004 byte)
  • OBF = 228 KB (234 089 bytes)
  • Số new = 177

Tôi nghĩ rằng kết quả khá tự giải thích.

+0

Wtg, thực sự đưa công việc vào. –

1

Theo như khả năng đọc là có liên quan: Tôi sẽ thay đổi nó thành một cái gì đó như thế này để làm cho nó dễ đọc:

new FastMap<Object>() 
{{ 
    put("Value", 12); 
    put("Unit", "Kg"); 
}}; 

Bạn tuy nhiên có thể muốn đọc this câu trả lời để tìm hiểu thêm về vấn đề hiệu suất liên quan.

+1

Điều đó sẽ không biên dịch. Bạn quên bộ thứ hai của niềng răng. – Jeffrey

+0

Tệ của tôi. Cảm ơn! – beta

+1

Liên kết bạn cung cấp là về java, không phải về GWT. Trong GWT nó biên dịch thành javascript mà không có bất kỳ đối tượng nào. Có thể trong GWT nó sẽ không có bất kỳ tác hại có thể nhìn thấy. –

1

Nếu bạn chỉ cần xác định bản đồ liên tục như thế này, có lẽ bạn muốn được tốt hơn (cả tốc độ khôn ngoan và khả năng đọc-khôn ngoan) sử dụng GuavaImmutableMap:

Map<Integer, Character> map = ImmutableMap.of(5, 'a', 1, 'b'); 
Map<Integer, String> largerMap = ImmutableMap.<Integer, String>builder() 
    .put(1, "a") 
    .put(2, "b"); 
    .put(5, "wisconsin") 
    .build(); 

(Họ từ Google và chúng hoàn toàn tương thích với GWT.)

+0

Vâng, câu hỏi là về bất kỳ lớp học nào. Trên thực tế trong hầu hết các trường hợp này DSL nội bộ của tôi calasses. Cảm ơn bạn đã liên kết về Guava và ImmutableMap. Trông đầy hứa hẹn. –

2

Đây là Java tiêu chuẩn và độc lập với GWT. Nó được xử lý toàn diện trong Efficiency of Java “Double Brace Initialization”?.

Vấn đề lớn nhất tôi có với cú pháp này là không phân phối một phiên bản FastMap mà là một phân lớp ẩn danh. Đối tượng đó không so sánh với số bằng đối với phiên bản tương đương FastMap với dữ liệu được thiết lập theo cách truyền thống. Nó cũng có khả năng có gotchas khác mà không phải là rõ ràng và ít đơn giản hơn để gỡ lỗi.


Các chủ đề here nói này

Coi chừng - đúp cú đúp khởi là mát mẻ tìm kiếm, nhưng nó bậc độ lớn chậm hơn so với khởi tạo thường xuyên như nó phải tạo ra một lớp vô danh.

Ngoài ra, lớp được tạo sẽ được đưa vào không gian permgen, không phải là rác được thu thập. Các permgen là khá nhỏ theo mặc định - và nếu bạn điền vào nó, hệ thống của bạn được hosed.

Tôi luôn sử dụng chúng trong các bài kiểm tra đơn vị, nhưng không bao giờ trong mã sản xuất.

+2

Nhưng GWT không chỉ là một API Java, mà đúng hơn là một "DSL" (không thực sự, nhưng hài hước với tôi), nó giống như Java và biên dịch thành Javascript phía máy khách. Quá trình đó có thể xử lý DBI khác với trình biên dịch Java và JVM runtime xử lý nó. –

+0

Đồng ý với Kevin. –

+0

@Kevin: chỉ làm việc ra những gì * DBI * có nghĩa là ngoài giao diện cơ sở dữ liệu! Vâng, tôi đồng ý với bạn. Sẽ rất đơn giản nếu ai đó kiểm tra xem một vài dòng Java như thế nào biên dịch. – Borodin

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