2012-06-28 46 views
22

Gần đây tôi đã tìm hiểu về những lợi ích của EnumMap trong Java và muốn thay thế ImmutableMap<OccupancyType, BigDecimal> hiện tại thành EnumMap. Tuy nhiên, tôi cũng thích tài sản bất biến được cung cấp bởi ImmutableMap.Có enumMap bất biến tương ứng trong ổi?

  • Có biến thể nào, ImmutableEnumMap có sẵn trong ổi?
  • Về mặt lưu trữ nào (EnumMap vs ImmutableMap) hoạt động tốt hơn?
  • Tôi không thể tìm thấy so sánh của hai. Tôi đánh giá cao nếu ai đó có thể chỉ cho tôi một liên kết hoặc cung cấp một số hiểu biết về hiệu quả của hai cấu trúc dữ liệu?

Trả lời

30

Người đóng góp chính tại đây.

Ổi hiện không có biến thể ImmutableEnumMap, nhưng nếu có, nó có thể chỉ là một trình bao bọc xung quanh một EnumMap. (Điều đó nói rằng, triển khai không thay đổi tốt hơn một chút là có thể.)

EnumMap sẽ hoạt động tốt hơn so với số ImmutableMap cơ bản, trong mọi trường hợp; thật khó hoặc không thể đánh bại.

(Tôi sẽ file an issue để điều tra thêm một biến thể ImmutableMap cho enum loại chìa khóa, mặc dù.)


Cập nhật: Ổi 14 cho biết thêm Maps.immutableEnumMap().

+0

Cảm ơn. Bạn sẽ xảy ra để có một so sánh của hai tiện dụng? – brainydexter

+1

Ý tôi là, không có một số liệu xác định rõ ràng để so sánh chúng, nhưng tôi có thể nói với bạn rằng 'ImmutableMap' chỉ tốt hơn một chút so với' HashMap', vì vậy 'EnumMap' nên đánh bại cả hai cùng một yếu tố. –

+12

Cập nhật: 'ImmutableEnumMap' [đã được thêm.] (Http://code.google.com/p/guava-libraries/source/detail?r=835a7397fabb05a764a8008f4151c97f821a29ef) –

10

Tôi chỉ muốn cung cấp một ví dụ ngay bây giờ ImmutableEnumMap là trong Guava 14.0, vì đây là lớp riêng tư theo gói nên bạn không thể làm ImmutableEnumMap.of(). Bạn phải làm Maps.immutableEnumMap() để thay thế.

private final ImmutableMap<MyEnum, String> myEnumMap = Maps.immutableEnumMap(ImmutableMap.of(
     MyEnum.A, "A", 
     MyEnum.B, "B", 
     MyEnum.C, "C" 
     )); 

Không chắc chắn nếu có cú pháp tự nhiên hơn.

+2

Trong cuộc gọi đó tới 'Maps.immutableEnumMap', bạn có thể sử dụng' Bản đồ không thể thay đổi. builder(). (MyEnum.A, "A"). Build() 'để thêm nhiều hơn 5 giá trị vào bản đồ. – drvdijk

1

Khi ổi ImmutableEnumMap vẫn được đánh dấu phiên bản beta như của phiên bản 14, tôi đề xuất sử dụng chế độ xem không thể sửa đổi của bản đồ enum và sau đó vứt bỏ tham chiếu ban đầu tới bản đồ enum để đảm bảo rằng nó không thay đổi.

Ví dụ (trong một constructor):

Map entries = new EnumMap <SomeEnum, T>(SomeEnum.class); 
... // (fill in entries) 
this.entries = Collections.unmodifiableMap(entries); 
Các vấn đề liên quan