Google Guava so với Apache Commons [đã đóng]


212

Tôi đang tìm kiếm một triển khai bản đồ hai chiều trong Java và tình cờ thấy hai thư viện này:

Cả hai đều miễn phí, có triển khai bản đồ hai chiều mà tôi đang tìm kiếm (BidiMap trong Apache, BiMap trong Google), có kích thước gần như đáng kinh ngạc (Apache 493 kB, Google 499 kB) [ed.: Không còn đúng nữa!] Và dường như trong tất cả các cách khá giống với tôi.

Tôi nên chọn cái nào, và tại sao? Có một số lựa chọn thay thế tương đương khác (phải miễn phí và có ít nhất bản đồ hai chiều) không? Tôi đang làm việc với Java SE mới nhất, vì vậy không cần giới hạn một cách giả tạo đối với Java 5 hoặc bất cứ thứ gì tương tự.


5
Chắc chắn bạn nên cho chúng tôi tiêu chí chọn thư viện? Giấy phép, hiệu suất, phụ thuộc bổ sung, thuốc generic hỗ trợ, ...
SteveD

1
Bộ sưu tập của Google có sẵn trên repo1.maven.org: repo1.maven.org/maven2/com/google/collections/ mẹo
Joachim Sauer

Tôi đứng chính xác - Tôi đang tìm kiếm trong com / googlecode
kdgregory

Câu trả lời:


185

Theo tôi, sự lựa chọn tốt hơn là Guava (trước đây gọi là bộ sưu tập của Google):

  • nó hiện đại hơn (có thuốc generic)
  • nó hoàn toàn tuân theo các yêu cầu API của Bộ sưu tập
  • nó tích cực duy trì
  • CacheBuilder và nó là tiền thân MapMaker chỉ đơn giản là tuyệt vời

Bộ sưu tập Apache Commons cũng là một thư viện tốt, nhưng từ lâu đã thất bại trong việc cung cấp một phiên bản hỗ trợ chung (vốn là một chính nhược điểm đối với API bộ sưu tập theo quan điểm của tôi) và nói chung dường như là trong một bảo trì / không làm Chế độ -too-much-work-on-it Gần đây Bộ sưu tập Commons đã lấy lại một chút hơi nước, nhưng nó có một số bắt kịp để làm. .

Nếu kích thước tải xuống / dung lượng bộ nhớ / kích thước mã là một vấn đề thì Bộ sưu tập Apache Commons có thể là một ứng cử viên tốt hơn, vì đó là một phụ thuộc chung của các thư viện khác. Do đó, sử dụng nó trong mã của riêng bạn cũng có khả năng có thể được thực hiện mà không cần thêm bất kỳ phụ thuộc bổ sung nào. Chỉnh sửa: "Lợi thế" đặc biệt này đã bị phá hủy một phần bởi vì nhiều thư viện mới thực sự phụ thuộc vào Guava chứ không phụ thuộc vào Bộ sưu tập Commons của Apache.


3
Điều tôi thực sự tự hỏi: tại sao không có ý kiến ​​khác? Tôi có nên chơi quỷ ủng hộ? Rốt cuộc, Bộ sưu tập Apache Commons không phải là một thư viện tồi.
Joachim Sauer

10
Vì Apache thiếu tính tổng quát, tôi nghĩ rõ ràng hai trong số này là tương lai. Google là bước hợp lý tiếp theo về phía trước. Mặc dù, đó là một cảm giác kỳ lạ, nó được xây dựng bởi Người khổng lồ ... nhưng miễn là dưới giấy phép miễn phí, điều đó không quan trọng ngay cả khi nó được xây dựng bởi Microsoft. Tôi đoán.
Joonas Pulakka

12
Người đọc nên biết rằng đây là một câu trả lời rất cũ và nhiều thứ đã thay đổi
Roy Truelove

1
@RoyTruelove Tôi không ngạc nhiên khi có nhiều thay đổi và tôi rất thích nghe những suy nghĩ hiện tại của bạn về vấn đề này, hoặc có lẽ là một liên kết đến một đánh giá / so sánh gần đây hơn. Tôi thích triết lý "bất biến theo mặc định / chỉ có thể thay đổi nếu được yêu cầu" và bao gồm các loại thuốc generic trong ổi, nhưng tất cả các tài liệu tôi đã đọc có thể đã được đề ngày như bạn nói chủ đề này đã trở thành.
joeA

2
@ người kiểm tra2 - Xin lỗi, tôi đã viết bình luận đó một thời gian dài và thẳng thắn không nhớ lý do của nó. Nhìn lại, nó là một thứ khá vô ích! Tôi đã không nhận ra rằng libs đã không thay đổi kể từ năm 2010, nhưng tôi biết rằng chúng tiếp tục được sử dụng nhiều, và vì vậy tôi nói rằng nên an toàn. Nếu tôi đã bắt đầu với một dự án mới ngày hôm nay, tôi có thể có cái nhìn cận cảnh về bộ sưu tập lib của Goldman Sach: github.com/goldmansachs/gs-collections . Khi bạn là một trong những công ty độc ác nhất thế giới, bạn thực sự nên đảm bảo rằng bạn có một thư viện bộ sưu tập java tuyệt vời.
Roy Truelove

72

Từ faq: Câu hỏi thường gặp về Bộ sưu tập của Google

Tại sao Google xây dựng tất cả những thứ này, khi nó có thể đã cố gắng cải thiện Bộ sưu tập Commons Apache thay thế?

Bộ sưu tập Apache Commons rất rõ ràng không đáp ứng nhu cầu của chúng tôi. Nó không sử dụng thuốc generic, đây là một vấn đề đối với chúng tôi vì chúng tôi ghét phải nhận các cảnh báo biên dịch từ mã của chúng tôi. Nó cũng đã ở trong một "mô hình tổ chức" trong một thời gian dài. Chúng tôi có thể thấy rằng nó sẽ đòi hỏi một khoản đầu tư lớn từ chúng tôi để sửa chữa nó cho đến khi chúng tôi hài lòng sử dụng nó, và trong khi đó, thư viện của chúng tôi đã phát triển một cách hữu cơ.

Một sự khác biệt quan trọng giữa thư viện Apache và thư viện của chúng tôi là các bộ sưu tập của chúng tôi tuân thủ rất chặt chẽ các hợp đồng được chỉ định bởi các giao diện JDK mà chúng thực hiện. Nếu bạn xem lại tài liệu Apache, bạn sẽ tìm thấy vô số ví dụ về các vi phạm. Họ xứng đáng được công nhận vì đã chỉ ra những điều này rất rõ ràng, nhưng vẫn, đi lệch khỏi hành vi thu thập tiêu chuẩn là rủi ro! Bạn phải cẩn thận những gì bạn làm với một bộ sưu tập như vậy; lỗi luôn luôn chờ đợi để xảy ra.

Các bộ sưu tập của chúng tôi được tổng quát hóa hoàn toàn và không bao giờ vi phạm hợp đồng của họ (với các trường hợp ngoại lệ bị cô lập, trong đó việc triển khai JDK đã tạo tiền lệ mạnh mẽ cho các vi phạm có thể chấp nhận được). Điều này có nghĩa là bạn có thể chuyển một trong các bộ sưu tập của chúng tôi cho bất kỳ phương pháp nào mong đợi Bộ sưu tập và cảm thấy khá tự tin rằng mọi thứ sẽ hoạt động chính xác như họ cần.


71

Những điều quan trọng nhất tôi đã tìm thấy khiến Bộ sưu tập Google trở thành nơi bắt đầu:

  • Generics (Bộ sưu tập không có Generics - FTL)
  • Tính nhất quán với khung Bộ sưu tập (Josh Bloch là người chơi chính trong khung này)
  • Đúng. Những kẻ này đang tuyệt vọng gắn liền với vấn đề này ngay; họ có một cái gì đó giống như các bài kiểm tra đơn vị 25K và được gắn với việc nhận API vừa phải.

Đây là một video Youtube tuyệt vời về một cuộc nói chuyện được đưa ra bởi tác giả chính và anh ấy làm tốt công việc thảo luận về những gì đáng để biết về thư viện này.


7
+1 cho liên kết video
Jesper

1
Đọc thêm về Bộ sưu tập của Google: javalulk.org/articles/google-collections (một cuộc phỏng vấn với những người sáng tạo chính của nó). Tìm kiếm câu hỏi "Điều gì là duy nhất trong cách tiếp cận của bạn? Chẳng hạn, nó khác với Bộ sưu tập Commons của Apache như thế nào?"
Jonik

4
Bộ sưu tập Apache Commons Phiên bản 4 sử dụng thuốc generic. commons.apache.org/proper/commons-collections/release_4_0.html
Abdull

-7

Hai điều khác (tôi hy vọng tôi không sai)

  • Giấy phép của Guava (tên mới cho các bộ sưu tập của google) là Giấy phép Apache 2.0, nghĩa là: giống như với dự án Apache Commons
  • Tôi không thể tìm thấy mã nguồn của Guava trong một tệp để tải xuống (có vẻ như chỉ có thể truy cập git)

19
Nguồn nào? Bạn có nghĩa là bình có thể được đính kèm trong Eclipse? Nó đây rồi . BTW: Điều gì sai với git clone https://code.google.com/p/guava-libraries/git checkout v11.0.2?
Xaerxess

-7

Một điều khó chịu về Guava là Multimap không mở rộng java.util.Map. Nếu bạn có các phương thức của riêng bạn hoạt động trên Bản đồ, chúng sẽ không hoạt động trên Guava Multimaps (Giao diện Apache MultiMap mở rộng java.util.Map). Tôi chắc chắn rằng có một số lý do chính đáng tại sao nó lại như vậy nhưng nó cũng bất tiện.


16
Nếu bạn muốn sử dụng Multimaplike Map, luôn có asMap()chế độ xem.
Xaerxess

22
Làm thế nào để bạn mong đợi một Multimap để thực hiện java.util.Map? Một bản đồ đa cơ bản khác với bản đồ.
sleske

1
Multimap <K, V> mở rộng Bản đồ <K, Bộ sưu tập <V >> .. Tôi nghi ngờ G có lý do chính đáng để không sử dụng Bản đồ làm siêu giao diện mặc dù.
matt

10
@lucek: Nếu bạn xem qua Javadoc Map, với sự hiểu rằng mọi tham chiếu Vthực sự sẽ là một Collection<V>, tôi nghĩ bạn sẽ thấy khá nhanh tại sao nó không phải là một siêu giao diện tốt Multimap<K, V>.
ruakh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.