구글 구아바 대 아파치 커먼즈 [닫기]


212

Java에서 양방향 맵 구현을 찾고 있었고 다음 두 라이브러리를 우연히 발견했습니다.

둘 다 무료이며, 내가 찾던 양방향 맵 구현 (아파치의 BidiMap, Google의 BiMap)이 놀랍게도 거의 같은 크기입니다 (Apache 493 kB, Google 499 kB) 모든면에서 나와 비슷합니다.

어느 것을 선택해야하며 왜 그런가요? 다른 대안이 있습니까? (무료 여야하며 최소한 양방향지도가 있어야합니다)? 최신 Java SE를 사용하고 있으므로 인위적으로 Java 5 또는 이와 유사한 것을 제한 할 필요가 없습니다.


5
반드시 도서관 선택 기준을 제시해야합니까? 라이센스, 성능, 추가 종속성, 일반 지원 ...
SteveD

1
Google 컬렉션은 repo1.maven.org에서 제공됩니다 : repo1.maven.org/maven2/com/google/collections/…
Joachim Sauer

나는 정정했다-나는 com / googlecode를보고 있었다
kdgregory

답변:


185

내 생각에 더 나은 선택은 구아바 (이전의 Google 컬렉션이라고 함)입니다.

  • 더 현대적입니다 (제네릭이 있음)
  • Collections API 요구 사항을 절대적으로 따릅니다.
  • 적극적으로 유지되고 있습니다
  • CacheBuilder전임자 MapMaker는 평범합니다.

Apache Commons Collections도 좋은 라이브러리이지만 제네릭 사용 버전 ( 제 생각에 컬렉션 API 의 주요 단점) 을 제공하지 못 했으며 일반적으로 유지 보수 /하지 말아야 할 것으로 보입니다. 너무 많은 작업을 수행하는 모드 최근 Commons Collections에서 다시 한 번 스팀을 얻었지만 몇 가지를 따라 잡았습니다. .

다운로드 크기 / 메모리 풋 프린트 / 코드 크기가 문제인 경우 Apache Commons Collections는 다른 라이브러리의 일반적인 종속성이므로 더 나은 후보가 될 수 있습니다. 따라서 추가 종속성을 추가하지 않고도 자신의 코드에서도 사용할 수 있습니다. 편집 :이 특정 "이점"은 지금까지 부분적으로 전복되었습니다. 많은 새로운 라이브러리가 실제로 Apache Commons Collections가 아닌 Guava에 의존하기 때문입니다 .


3
내가 정말로 궁금한 점 : 왜 다른 의견이 없는가? 악마 대변자를 플레이해야합니까? Apache Commons Collections는 결국 나쁜 라이브러리가 아닙니다.
Joachim Sauer

10
아파치에는 제네릭이 없기 때문에이 두 가지 중 어느 것이 미래인지는 분명합니다. Google은 다음 단계로 발전했습니다. 하지만 The Giant에 의해 만들어진다는 이상한 느낌이 들지만 무료 라이센스가 적용되는 한 Microsoft가 만든 경우에도 중요하지 않습니다. 나는 추측한다.
Joonas Pulakka

12
독자들은 이것이 매우 오래된 답변이며 많은 변화 가 있음을 알고 있어야합니다.
Roy Truelove

1
@RoyTruelove 많은 부분이 바뀌 었다는 사실에 놀랄 일이 아니며,이 문제에 대한 귀하의 현재 생각이나 최근 리뷰 / 비교에 대한 링크를 듣고 싶습니다. 나는 "필요한 경우에만 변경할 수없는"철학과 구아바에 제네릭을 포함시키는 것을 좋아하지만, 내가 읽은 자료는이 스레드가되었다고 말한 것처럼 모두 날짜가 지난 것일 수 있습니다.
joeA

2
@ testerjoe2-죄송합니다, 그 댓글을 오래 전에 작성했으며 그 이유를 솔직히 기억하지 않습니다. 가늠할 때 그것은 꽤 도움이되지 않은 것이었다! 나는 2010 년 이후 libs가 바뀌지 않았다는 것을 몰랐지만 계속해서 많이 사용된다는 것을 알고 있으므로 안전해야합니다. 오늘 새 프로젝트로 시작했다면 아마도 Goldman Sach의 콜렉션 라이브러리 github.com/goldmansachs/gs-collections를 자세히 살펴볼 것 입니다. 당신이 세계에서 가장 사악한 회사 중 하나라면 실제로 자바 컬렉션 라이브러리를 가지고 있는지 확인해야합니다.
Roy Truelove

72

FAQ에서 : Google 컬렉션 FAQ

대신 Apache Commons Collections를 개선하려고 시도했을 때 Google이 왜이 모든 것을 구축 했습니까?

Apache Commons Collections는 우리의 요구를 충족시키지 못했습니다. 우리는 코드에서 컴파일 경고를 얻는 것을 싫어하기 때문에 제네릭을 사용하지 않습니다. 또한 오랫동안 "보류 패턴"에있었습니다. 우리는 그것을 기꺼이 사용할 때까지 고치려면 상당한 투자가 필요하다는 것을 알 수 있었고 그 동안 우리 도서관은 이미 유기적으로 성장하고있었습니다.

Apache 라이브러리와 우리 라이브러리의 중요한 차이점은 컬렉션이 구현하는 JDK 인터페이스에 지정된 계약을 충실히 준수한다는 것입니다. Apache 문서를 검토하면 수많은 위반 사례를 찾을 수 있습니다. 그들은 이것을 명확하게 지적한 것에 대한 가치가 있지만 표준 수집 행동에서 벗어나는 것은 위험합니다! 그러한 컬렉션으로 무엇을하는지주의해야합니다. 버그는 항상 일어나기를 기다리고 있습니다.

우리의 컬렉션은 완전히 생성되며 계약을 위반하지 않습니다 (JDK 구현이 수용 가능한 위반에 대한 강력한 선례를 설정 한 격리 된 예외는 제외). 즉, 컬렉션을 기대하는 모든 방법으로 컬렉션 중 하나를 전달할 수 있으며 원하는대로 작동 할 것이라고 확신합니다.


71

내가 찾은 가장 중요한 것은 Google 컬렉션을 시작하기위한 장소로 만듭니다.

  • 제네릭 (제네릭이없는 컬렉션-FTL)
  • Collections 프레임 워크와의 일관성 (Josh Bloch는이 프레임 워크의 핵심 플레이어였습니다)
  • 단정. 이 사람들은이 문제를 바로 잡는 데 필사적으로 묶여 있습니다. 그들은 25K 단위 테스트와 같은 것을 가지고 있으며 API를 올바르게 얻는 것과 관련이 있습니다.

다음 은 주요 저자가 제공 한 대화에 관한 유튜브 비디오 입니다. 그는이 라이브러리에 대해 알아야 할 가치가있는 것에 대해 잘 설명하고 있습니다.


7
비디오 링크 +1
Jesper

1
Google 컬렉션에 대한 추가 정보 : javalobby.org/articles/google-collections (주요 제작자와의 인터뷰) "어떻게 접근 할 때 독특합니까? 예를 들어 Apache Commons Collection과 다른 점은 무엇입니까?"라는 질문을 찾으십시오.
Jonik

4
Apache Commons Collections 버전 4는 제네릭을 사용합니다. commons.apache.org/proper/commons-collections/release_4_0.html
Abdull

-7

다른 두 가지 (내가 틀리지 않기를 바랍니다)

  • Guava (Google 컬렉션의 새로운 이름) 라이센스는 Apache License 2.0이며 이는 Apache Commons 프로젝트와 동일합니다.
  • 다운로드 할 파일에서 Guava의 소스 코드를 찾을 수 없습니다 (git-access 만 가능함)

19
소스? Eclipse에 첨부 할 수있는 jar를 의미합니까? 여기 있습니다 . BTW : 무엇의 잘못 git clone https://code.google.com/p/guava-libraries/git checkout v11.0.2?
Xaerxess

-7

Guava에 대한 한 가지 나쁜 점은 멀티 맵이 java.util.Map을 확장하지 않는다는 것입니다. 맵에서 작동하는 고유 한 메소드가있는 경우 Guava 멀티 맵에서 작동하지 않습니다 (Apache MultiMap 인터페이스는 java.util.Map을 확장 함). 나는 그것이 왜 그런지에 대한 좋은 이유가 있다고 확신하지만 또한 불편합니다.


16
Multimap처럼 사용하고 싶다면 Map항상 asMap()볼 수 있습니다.
Xaerxess

22
멀티 맵이 java.util.Map을 어떻게 구현할 것으로 기대하십니까? 멀티 맵은 기본적으로 맵과 다릅니다.
sleske

1
Multimap <K, V>는 Map <K, Collection <V >>.를 확장합니다. G는 Map을 슈퍼 인터페이스로 사용하지 않는 좋은 이유가 있다고 생각합니다.
matt

10
@lucek : Javadoc을 살펴보면 Map, 모든 참조 V가 실제로 a가 될 것이라는 것을 이해 하면서 Collection<V>, 왜 이것이 훌륭한 수퍼 인터페이스가 아닌지 꽤 빨리 알게 될 것입니다 Multimap<K, V>.
ruakh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.