구아바와 아파치 동등한 라이브러리의 큰 개선점은 무엇입니까?


123

우리는 현재 아파치 컬렉션, 문자열 유틸리티 등을 사용하고 있습니다. 아파치 기반 구현에서 전환해야하는지 결정해야합니다.

중요한 기준은 개발자의 사용 용이성입니다. 성능 / 메모리 사용량은 아직 우리에게 중요한 문제가 아닙니다. 이 시점에서 개발 속도가 핵심 기준입니다.

개발자의 삶이 구아바로 훨씬 쉬워 진 것에 대한 의견에 감사드립니다.

답변:


223

첫째, javamonkey79가 설명했듯이 Google Guava와 Apache Commons는 유사한 기능을 공유하지만 둘 다 해당 제품에는없는 기능도 있습니다. 따라서 하나의 라이브러리로만 제한하는 것은 현명하지 않을 수 있습니다.

즉, 내가 선택해야한다면 Guava에 필요한 기능이없는 (드문) 경우를 위해 Apache Commons를 유지하면서 Guava를 사용하기로 선택했습니다. 이유를 설명해 드리겠습니다.

구아바는 더 "현대적"입니다.

Apache Commons는 정말 성숙한 라이브러리이지만 거의 10 년이 지났으며 Java 1.4를 대상으로합니다. Guava는 2007 년오픈 소스로 Java 5를 대상으로했습니다. 따라서 Guava는 generics , varargs , enumsautoboxing같은 Java 5 기능의 이점을 크게 얻었습니다 .

Guava 개발자에 따르면 제네릭은 Apache Commons를 개선하는 대신 새 라이브러리를 만들기로 선택한 이유 중 하나입니다 ( 'Google이 Apache를 개선하려고 시도했을 때이 모든 것을 구축 한 이유는 무엇입니까?' 라는 제목 아래 google-collections FAQ 참조). 대신 Commons Collections? " ).

나는 그들에 동의한다 : 종종 비판을 받았지만 (수정이없고, 이전 버전과의 호환성으로 인해 제한됨), Java 제네릭은 Guava처럼 적절하게 사용될 때 여전히 매우 유용합니다. 생성되지 않은 컬렉션으로 작업하는 것보다 그만두고 싶습니다!

(Apache Commons 3.0 Java 1.5 이상을 대상으로합니다.)

구아바는 매우 잘 설계 / 문서화되어 있습니다.

이 코드는 API를 더 읽기 쉽고, 검색 가능하고, 성능이 뛰어나고, 안전하고, 스레드로부터 안전하게 만드는 모범 사례와 유용한 패턴으로 가득 차 있습니다.

Effective Java (굉장한 책 ​​BTW) 를 읽은 후 코드에서 다음 패턴을 볼 수 있습니다.

  • 공장 메소드 (예 ImmutableList.copyOf())
  • 빌더 패턴 ( ImmutableList.builder(), Joiner, CharMatcher, Splitter, Ordering, ...)
  • 불변성 (불변 모음, CharMatcher, Joiner, Splitter, ...)
  • 구현 숨기기 ( Predicates.xXx, ...)
  • 상속 ( ForwardXXX컬렉션) 보다 구성을 선호
  • 널 검사
  • 열거 형 단일 패턴
  • 직렬화 프록시
  • 신중한 명명 규칙

이러한 디자인 선택으로 인한 이점을 몇 시간 동안 설명 할 수 있습니다 (원하는 경우 알려주세요). 문제는 이러한 패턴이 "쇼용"일뿐만 아니라 실제 가치가 있다는 것입니다. API는 사용하기 쉽고 배우기 쉬우 며 (문서화가 얼마나 잘되었는지 잊었습니까?), 더 효율적이며, 많은 클래스는 불변성으로 인해 더 간단하고 스레드로부터 안전합니다.

보너스 포인트로 코드를 보면 많은 것을 배울 수 있습니다. :)

구아바는 일관됩니다

Kevin Bourrillion (Guava의 수석 개발자)은 라이브러리 전체에서 높은 수준의 품질 / 일관성을 유지하는 데 큰 역할을합니다. 물론 그는 혼자가 아니며 많은 훌륭한 개발자 가 Guava에 기여했습니다 ( 현재 Google에서 일하는 Joshua Bloch 도 있습니다!).

구아바 뒤에 핵심 철학 및 디자인 선택 라이브러리에 걸쳐 일관성, 그리고 개발자 (안 JDK API를 과거의 실수에서 배운, 아주 좋은 (IMO) API 설계 원칙을 준수 들이 있지만, 실수).

구아바는 중량 대비 전력 비율이 높습니다.

Guava 디자이너는 API를 가장 유용한 기능으로 제한하여 너무 많은 기능을 추가하려는 유혹에 저항합니다. 그들은 일단 추가 된 기능을 제거하는 것이 매우 어렵다는 것을 알고 있으며, Joshua Bloch의 API 디자인에 대한 모토 인 "의심스러운 경우에는 제거하십시오"를 따릅니다 . 또한 @Beta 주석을 사용 하면 특정 API를 사용하지 않고도 일부 디자인 선택테스트 할 수 있습니다 .

위에서 언급 한 디자인 선택은 매우 컴팩트 한 API를 허용합니다. 간단하게 볼 지도 작성기 는 "간단한"빌더 내부 포장 힘을 볼 수 있습니다. (더 간단하지만?) 다른 좋은 예는 CharMatcher , SplitterOrdering 입니다.

구아바의 다양한 부분을 구성하는 것도 매우 쉽습니다. 예를 들어, 복잡한 함수 의 결과를 캐시하고 싶 습니까? 이 함수를 MapMaker 및 BINGO에 제공하면 스레드로부터 안전한 컴퓨팅 맵 / 캐시를 얻게됩니다. 맵 / 함수 입력을 특정 문자열로 제한해야합니까? 문제 없습니다 . CharMatcher 를 사용하여 부적절한 문자열을 거부 하는 ConstrainedMap 내부에 래핑합니다 .

구아바는 활발하게 개발 중입니다

Apache Commons의 개발이 Commons Lang 3.0에 대한 작업으로 가속화 된 것처럼 보이지만, Guava는 현재 더 많은 힘을 얻고있는 반면 Google은 내부 클래스의 더 많은 소스를 공개합니다.

구글은 내부적으로 크게 의존하고 있기 때문에 조만간 사라지지 않을 것이라고 생각합니다. 또한, 개방의 공통 라이브러리를 소싱하는 것은 더 쉽게 오픈 소스에 구글을 할 수 있습니다 기타 (대신에 의존 라이브러리 재 포장 Guice 현재처럼 그들을 않습니다 ).

결론

위의 모든 이유 때문에 Guava는 새 프로젝트를 시작할 때 가장 많이 찾는 라이브러리입니다. 그리고 저는 Google과이 환상적인 라이브러리를 만든 멋진 Guava 개발자에게 매우 감사합니다.


추신 : 당신은 또한 이 다른 질문 을 읽고 싶을 수도 있습니다.

PPS : Google 주식이 없습니다 (아직).


감사! * blushes * 저는 Guava의 매우 활발한 개발에 대해 더 많이 이야기하고 Java 1.5 기능을 더 자세히 설명하기 위해 내 대답을 편집했습니다.
Etienne Neveu

1
: 그냥 케빈 Bourrillion이 이야기에서 아파치 코 몬즈 대 구아바에 대해 이야기 것으로 나타났습니다 youtube.com/watch?v=9ni_KEkHfto#t=42m38s
에티엔 느 느뵈

참고로, Guava는 API를 변경하고 이전 메서드를 자주 사용하지 않으므로 버전 잠금 및 Guava를 사용하는 다른 타사 라이브러리와의 비 호환성 등의 문제가 발생할 수 있습니다.
Archimedes Trajano

24

저는 2010 년 8 월부터 r06 릴리스부터 구아바를 사용하고 있습니다. 기본적으로 개발할 그린 필드 자바 라이브러리가 있었기 때문에 J2SE API를위한 최고의 부속 라이브러리를 찾아 보았습니다. 전통적으로 우리는 Apache Commons 라이브러리를 사용했지만 거기에 무엇이 있는지보고 싶었고 Guava를 사용하기 시작했습니다.

장점

  1. Java 5.0 언어 구성. 라이브러리는 Bloch의 "Effective Java : 2nd Edition"(불변성, 빌더 패턴, 생성자 대신 팩토리, Generics 등)에서 대부분의 디자인 단서를 가져옵니다. 이는 코드를보다 단단하고 표현력있게 만듭니다.
  2. 기능적 프로그래밍 지원, 특히 최상위 수준의 Function 및 Predicate 인터페이스.

단점

  1. Apache Commons, 특히 commons-codec을 대체하기에 충분하지 않습니다.
  2. '구아바 요리 책'은 없습니다. 라이브러리는 미니멀하고 직교합니다. 따라서이를 최대한 활용하기위한 명확한 학습 곡선이 있습니다. 언급했듯이 Javadoc은 훌륭하지만 더 긴 소스 코드 사례 연구가 도움이 될 것입니다.
  3. Java 1.3 또는 1.4가 필요한 환경에 있다면 운이 좋지 않습니다.

나에게 Guava는 Java를 간결하고 표현력이 풍부한 스크립팅 언어에 더 가깝게 느끼게합니다.


16

내 경험상 나는 그들이 서로 경쟁하거나 구아바가 아파치 라이브러리에서 향상된다는 것을 인식하지 못합니다. 오히려 구아바 는 아파치 라이브러리를 보완 합니다. 구아바에는 아파치에없는 클래스와 유틸리티가 있으며 그 반대의 경우도 마찬가지입니다.

따라서 저는 여러분이 그 자체로 전환해야한다는 것을 모릅니다. "올바른 작업에 적합한 도구 사용"이라고 말하겠습니다.


1
최근에 Guava가 FileNameUtils에서 Apache가 제공하는 것과 거의 비슷하지 않은 것을 확인한 후이 결론에 도달했습니다 (예 : 중복되는 부분이 있지만 Apache의 FileNameUtils에는 Guava의 파일보다 훨씬 더 많습니다. 또한 Google이 사용해야하는 이유는 무엇 Files입니까? JDK를 사용하려면 Files전체 경로를 작성해야합니다 ...). 내 앱에는 많은 파일 유틸리티가 필요했기 때문에이 경우 Apache 사용을 피할 수 없었습니다.
Don Cheadle 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.