Đầu tiên, như javamonkey79 đã giải thích, trong khi Google Guava và Apache Commons chia sẻ các tính năng tương tự, cả hai đều có chức năng không có trong đối tác của họ. Do đó, việc giới hạn bản thân chỉ trong một thư viện có thể là không khôn ngoan.
Điều đó đã được nói, nếu tôi phải chọn, tôi sẽ chọn sử dụng Guava, giữ các Apache Commons cho các trường hợp (hiếm) mà Guava không có chức năng cần thiết. Hãy để tôi cố gắng giải thích tại sao.
Quả ổi "hiện đại" hơn
Apache Commons là một thư viện thực sự trưởng thành, nhưng nó cũng đã gần 10 năm tuổi và nhắm mục tiêu Java 1.4. Guava đã được mở nguồn vào năm 2007 , nhắm vào Java 5 và do đó, Guava được hưởng lợi rất nhiều từ các tính năng của Java 5: generic , varargs , enums và autoboxing .
Theo các nhà phát triển Guava, generic là một lý do khiến họ chọn tạo thư viện mới thay vì cải thiện Apache Commons (xem Câu hỏi thường gặp về bộ sưu tập google , dưới tiêu đề "Tại sao Google xây dựng tất cả những điều này, khi nó có thể đã cố gắng cải thiện Apache Bộ sưu tập Commons thay thế? " ).
Tôi đồng ý với họ: mặc dù thường bị chỉ trích (không thống nhất, bị hạn chế do khả năng tương thích ngược), nhưng các tổng quát của Java vẫn rất hữu ích khi được sử dụng một cách thích hợp, giống như Guava. Tôi thà bỏ việc hơn là làm việc với các bộ sưu tập không được tạo ra!
(Lưu ý rằng Apache Commons 3.0, thực hiện mục tiêu Java 1.5 trở lên)
Quả ổi được thiết kế / ghi chép rất tốt
Mã này có đầy đủ các thực tiễn tốt nhất và các mẫu hữu ích để làm cho API dễ đọc hơn, có thể khám phá, thực hiện, bảo mật, an toàn luồng ...
Đọc xong Java hiệu quả (cuốn sách tuyệt vời BTW), tôi thấy các mẫu này ở mọi nơi trong mã:
- phương pháp nhà máy (như
ImmutableList.copyOf()
)
- xây dựng mô hình (
ImmutableList.builder()
, Joiner
, CharMatcher
, Splitter
, Ordering
, ...)
- tính bất biến (bộ sưu tập bất biến,
CharMatcher
, Joiner
, Splitter
, ...)
- ẩn thực hiện (
Predicates.xXx
, ...)
- ủng hộ thành phần hơn thừa kế (các
ForwardXXX
bộ sưu tập)
- kiểm tra null
- mô hình enum-singleton
- proxy tuần tự hóa
- quy ước đặt tên chu đáo
Tôi có thể tiếp tục hàng giờ để giải thích những lợi thế do những lựa chọn thiết kế này mang lại (cho tôi biết nếu bạn muốn tôi). Vấn đề là, các mẫu này không chỉ là "cho chương trình", mà chúng còn có một giá trị thực sự: API là một niềm vui để sử dụng, dễ học hơn (tôi đã quên nói nó được ghi chép tốt như thế nào?), Hiệu quả hơn và nhiều lớp đơn giản hơn / an toàn luồng do tính bất biến của chúng.
Là một điểm thưởng, người ta học được rất nhiều bằng cách nhìn vào mã :)
Quả ổi là phù hợp
Kevin Bourrillion (nhà phát triển chính của Guava) thực hiện một công việc tuyệt vời để duy trì mức độ cao về chất lượng / tính nhất quán trong toàn thư viện. Anh ấy tất nhiên không đơn độc, và rất nhiều nhà phát triển vĩ đại đã đóng góp cho Guava (ngay cả Joshua Bloch , hiện đang làm việc tại Google!).
Các triết lý cốt lõi và các lựa chọn thiết kế đằng sau Guava là nhất quán trong thư viện và các nhà phát triển tuân thủ các nguyên tắc thiết kế API (IMO) rất tốt, đã học được từ những sai lầm trong quá khứ của API JDK ( mặc dù không phải là lỗi của họ ).
Quả ổi có tỷ lệ công suất trên trọng lượng cao
Các nhà thiết kế Guava chống lại sự cám dỗ để thêm quá nhiều tính năng, giới hạn API ở những tính năng hữu ích nhất. Họ biết rằng rất khó để xóa một tính năng sau khi thêm và tuân theo phương châm của Joshua Bloch về thiết kế API: "Khi nghi ngờ, hãy bỏ qua nó" . Ngoài ra, sử dụng chú thích @Beta cho phép họ kiểm tra một số lựa chọn thiết kế mà không cần phải cam kết với một API cụ thể .
Các lựa chọn thiết kế được đề cập ở trên cho phép API rất nhỏ gọn. Chỉ cần nhìn vào MapMaker để thấy sức mạnh được đóng gói bên trong một trình xây dựng "đơn giản". Các ví dụ tốt khác (mặc dù đơn giản hơn?) Là CharMatcher , Splitter và Đặt hàng .
Nó cũng rất dễ dàng để soạn các phần khác nhau của ổi. Ví dụ, giả sử bạn muốn lưu trữ kết quả của một hàm phức tạp ? Cung cấp chức năng này cho MapMaker và BINGO của bạn, bạn đã có một bản đồ / bộ đệm máy tính an toàn luồng. Cần hạn chế các đầu vào bản đồ / chức năng cho các Chuỗi cụ thể? Không có vấn đề gì, hãy bọc nó trong ConstrainedMap , sử dụng CharMatcher để từ chối các chuỗi không phù hợp ...
Quả ổi đang phát triển tích cực
Trong khi sự phát triển của Apache Commons dường như đã tăng tốc với công việc trên Commons Lang 3.0, thì Guava dường như sẽ thu được nhiều hơi nước hơn vào lúc này, trong khi Google mở thêm các lớp bên trong của họ.
Vì Google phụ thuộc rất nhiều vào nội bộ, tôi không nghĩ rằng nó sẽ biến mất bất cứ lúc nào sớm. Thêm vào đó, tạo nguồn mở thư viện phổ biến của nó cho phép Google nguồn dễ dàng hơn mở khác thư viện phụ thuộc vào nó (thay vì đóng gói lại họ, như Guice hiện không ).
Phần kết luận
Vì tất cả những lý do trên, Guava là thư viện của tôi khi bắt đầu một dự án mới. Và tôi rất biết ơn Google và các nhà phát triển Guava tuyệt vời, người đã tạo ra thư viện tuyệt vời này.
PS: bạn cũng có thể muốn đọc câu hỏi SO khác này
PPS: Tôi chưa sở hữu bất kỳ cổ phiếu Google nào (chưa)