Những cải tiến lớn giữa các thư viện tương đương ổi và apache là gì?


123

Chúng tôi hiện đang sử dụng các bộ sưu tập apache, các tiện ích chuỗi, v.v. Tôi cần quyết định xem chúng tôi có nên chuyển từ triển khai nền tảng apache không.

Các tiêu chí quan trọng là dễ dàng của các nhà phát triển sử dụng. Hiệu suất / sử dụng bộ nhớ chưa phải là một vấn đề quan trọng đối với chúng tôi. Tốc độ phát triển là tiêu chí quan trọng tại thời điểm này.

Tôi sẽ đánh giá cao ý kiến ​​về cách cuộc sống của nhà phát triển trở nên dễ dàng hơn với ổi.

Câu trả lời:


223

Đầ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 , enumsautoboxing .

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 ForwardXXXbộ 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Đặ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)


Cảm ơn! * đỏ mặt * Tôi vừa chỉnh sửa câu trả lời của mình để nói thêm về sự phát triển rất tích cực của Guava và để chi tiết hơn các tính năng Java 1.5.
Etienne Neveu

1
Chỉ cần lưu ý rằng Kevin Bourrillion nói về Guava vs Apache Commons trong cuộc nói chuyện này: youtube.com/watch?v=9ni_KEkHfto#t=42m38s
Etienne Neveu

Một lưu ý, Guava thay đổi API của nó và không dùng các phương thức cũ của nó khá thường xuyên nên việc phụ thuộc vào nó có thể gây ra các vấn đề như khóa phiên bản và không tương thích với các thư viện bên thứ ba khác sử dụng Guava.
Archimedes Trajano

24

Tôi đã sử dụng ổi từ tháng 8 năm 2010, bắt đầu với phiên bản r06. Về cơ bản, tôi đã có một thư viện java trường xanh để phát triển, vì vậy tôi đã tìm kiếm thư viện bổ trợ tốt nhất cho API J2SE. Theo truyền thống, chúng tôi đã sử dụng các thư viện Apache Commons, nhưng tôi muốn xem những gì ở ngoài đó và bắt đầu sử dụng Guava.

Ưu

  1. Cấu trúc ngôn ngữ Java 5.0. Thư viện lấy hầu hết các tín hiệu thiết kế từ "Java hiệu quả: Phiên bản thứ 2" của Bloch: Tính không thay đổi, mẫu xây dựng, nhà máy thay vì nhà xây dựng, Generics, v.v. Điều này làm cho mã của bạn chặt chẽ và biểu cảm hơn.
  2. Hỗ trợ lập trình chức năng, đặc biệt là với các giao diện Chức năng và Vị ngữ cấp cao nhất.

Nhược điểm

  1. Nó không phải là sự thay thế đủ cho Apache Commons, đặc biệt là commons-codec.
  2. Không có một 'cuốn sách nấu ăn ổi'. Thư viện vừa tối giản vừa trực giao. Do đó, có một đường cong học tập nhất định để tận dụng tối đa lợi thế của nó. Như đã đề cập, Javadoc là tuyệt vời, nhưng một số nghiên cứu trường hợp mã nguồn dài hơn sẽ hữu ích.
  3. Nếu bạn đang ở trong một môi trường yêu cầu Java 1.3 hoặc 1.4, bạn sẽ không gặp may.

Đối với tôi, Guava làm cho Java cảm thấy gần gũi hơn với một ngôn ngữ kịch bản ngắn gọn, biểu cảm và điều đó thật tuyệt.


16

Theo kinh nghiệm của tôi, tôi không nhận thấy rằng họ tranh cãi với nhau, hoặc ổi cải thiện tình trạng apache apache. Thay vào đó, ổi bổ sung cho libs apache. Có những lớp học và tiện ích trong ổi không bị apache và ngược lại.

Do đó, tôi không biết rằng bạn cần phải chuyển đổi - tôi sẽ nói "sử dụng đúng công cụ cho đúng công việc".


1
Gần đây tôi đã đi đến kết luận này, sau khi thấy rằng Guava thậm chí không có gì gần với những gì Apache cung cấp trong FileNameUtils (vâng, có sự trùng lặp, nhưng FileNameUtils của Apache có nhiều hơn các tệp của Guava. Ngoài ra, tại sao tôi phải sử dụng Files? để sử dụng JDK Files, tôi phải viết ra toàn bộ đường dẫn ...). Ứng dụng của tôi cần rất nhiều tiện ích Tệp, vì vậy tôi không thể tránh sử dụng Apache trong trường hợp này.
Don Cheadle
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.