guava와 apache 등가 라이브러리의 큰 개선점은 무엇입니까?
현재 Apache 컬렉션, 문자열 유틸리티 등을 사용하고 있습니다.Apache Foundations 구현에서 전환해야 하는지 결정해야 합니다.
중요한 기준은 개발자의 사용 편의성입니다.퍼포먼스/메모리 사용량은 아직 중요한 문제가 아닙니다.현시점에서는 개발 속도가 중요한 기준입니다.
guava로 개발자의 생활이 상당히 쉬워진 것에 대한 의견을 주시면 감사하겠습니다.
먼저 javamonkey79가 설명한 바와 같이 Google Guava와 Apache Commons는 비슷한 기능을 공유하지만, 둘 다 상대방에는 없는 기능을 가지고 있다.따라서 한 개의 라이브러리로만 자신을 제한하는 것은 현명하지 않을 수 있습니다.
그렇다고는 해도 굳이 선택해야 한다면, Guava를 사용하는 것을 선택하고, Guava가 필요한 기능을 가지고 있지 않은 경우는 드물지만 Apache Commons를 유지합니다.왜 그런지 설명해보겠습니다.
Guava는 더 '현대적'입니다.
Apache Commons는 매우 성숙한 라이브러리이지만, 거의 10년이 되어 Java 1.4를 대상으로 하고 있습니다.Guava는 2007년에 오픈 소스로 Java 5를 타겟으로 하고 있기 때문에 Generics, varargs, enums, autoboxing 등의 Java 5 기능을 통해 큰 이점을 얻을 수 있습니다.
Guava 개발자들에 따르면 제네릭스는 Apache Commons를 개선하는 대신 새로운 라이브러리를 만드는 것을 선택한 이유 중 하나입니다(Google이 Apache Commons Collections를 개선하려고 할 수 있었는데 왜 구글 컬렉션 FAQ를 참조하십시오).
저도 동의해요: 자주 비판받지만(리플리케이션 없음, 하위 호환성 때문에 제한됨), Java 제네릭은 Guava처럼 적절하게 사용할 경우 여전히 매우 유용합니다.비세대 컬렉션으로 일하느니 차라리 그만두겠어!
(Apache Commons 3.0은 Java 1.5+를 대상으로 합니다.)
Guava는 매우 잘 설계/문서화되어 있습니다.
이 코드는 API를 보다 읽기 쉽고, 검출 가능하며, 퍼포먼스, 시큐어, 스레드 세이프를 실현하기 위한 베스트 프랙티스와 유용한 패턴으로 가득 차 있습니다.
Effective Java(대단한 책 BTW)를 읽고 코드 곳곳에서 다음과 같은 패턴을 볼 수 있습니다.
- 방법(「」등을 참조해 주세요.
ImmutableList.copyOf()) - 패턴Builder pattern)
ImmutableList.builder(),Joiner,CharMatcher,Splitter,Ordering, ... ) - 불변의 컬렉션, 불변성,
CharMatcher,Joiner,Splitter), ... ) - 숨김(Implementation Hidding)
Predicates.xXx, ... ) - 하는 것
ForwardXXX컬렉션)를 참조해 주세요. - 무효로 하다
- enum-singleton
- 시리얼라이제이션
- 잘 생각해 낸 명명 규칙
이러한 디자인 선택이 가져오는 이점을 몇 시간 동안 설명할 수 있습니다(원하시면 말씀하세요).중요한 것은 이러한 패턴은 "쇼용"일 뿐만 아니라 진정한 가치를 가지고 있다는 것입니다.API는 사용하기에 즐겁고 배우기 쉬우며(내가 API가 얼마나 잘 문서화되어 있는지 말하는 것을 잊었나?), 더 효율적이며, 많은 클래스는 불변성이 있기 때문에 더 단순하고 스레드 세이프하다는 것입니다.
보너스 포인트로 코드를 보고 많은 것을 배울 수 있습니다.
Guava는 일관성이 있습니다.
Kevin Bourrillion(Guava의 수석 개발자)은 라이브러리 전체에서 높은 품질과 일관성을 유지하는 데 뛰어난 역량을 발휘합니다.물론 그는 혼자가 아니다.그리고 많은 훌륭한 개발자들이 Guava에 기여하고 있다(현재 Google에서 일하고 있는 Joshua Bloch도 마찬가지).
Guava의 핵심 철학과 설계 선택은 라이브러리 전체에서 일관되며 개발자들은 JDK API의 과거 실수(실수는 아니지만)에서 배운 매우 우수한(IMO) API 설계 원칙을 고수하고 있습니다.
Guava는 중량 대비 전력 비율이 높다
Guava 디자이너들은 API를 가장 유용한 것으로 제한하면서 너무 많은 기능을 추가하고 싶은 유혹을 이겨냅니다.그들은 한번 추가된 기능을 삭제하는 것이 매우 어렵다는 것을 알고 있으며, API 설계에 관한 Joshua Bloch의 모토를 따르고 있다: "의심스러울 때는 제외하라."또한 @Beta 주석을 사용하면 특정 API를 적용하지 않고 일부 설계 선택 항목을 테스트할 수 있습니다.
위에서 언급한 설계 선택은 매우 콤팩트한 API를 가능하게 합니다.MapMaker를 보면 "심플한" 빌더 안에 들어 있는 파워를 확인할 수 있습니다.그 밖에 CharMatcher, Splitter, Ordering 등의 좋은 예도 있습니다.
구아바의 다양한 부분을 작곡하는 것도 매우 쉽습니다.예를 들어, 복잡한 함수의 결과를 캐시하고 싶다고 합시다.이 기능을 MapMaker와 BINGO에 제공하면 스레드 세이프 컴퓨팅 맵/캐시를 얻을 수 있습니다.맵/함수 입력을 특정 문자열로 제한해야 합니까?문제 없습니다. CharMatcher를 사용하여 부적절한 문자열을 거부하기 위해 ConstrainedMap 내에서 랩합니다.
Guava는 현재 개발 중입니다.
Commons Lang 3.0에 대한 작업으로 Apache Commons의 개발이 가속화된 것으로 보이지만, Guava는 현재 더욱 활기를 띠고 있는 것으로 보이는 반면 Google은 내부 클래스를 더 많이 오픈하고 있다.
구글은 내부적으로 크게 의존하고 있기 때문에 조만간 사라질 것이라고는 생각하지 않습니다.게다가 공통 라이브러리를 오픈 소싱하는 것으로, Google은 Guice와 같이 다른 라이브러리를 재패키지화하는 대신에, 이것에 의존하는 다른 라이브러리를 보다 간단하게 오픈 소스 할 수 있습니다.
결론
위와 같은 이유로 새로운 프로젝트를 시작할 때 Guava는 제가 자주 찾는 도서관입니다.그리고 구글과 이 환상적인 라이브러리를 만들어준 훌륭한 구아바 개발자들에게 매우 감사합니다.
PPS: 구글 주식을 보유하고 있지 않습니다(아직).
r06 릴리즈부터 2010년 8월부터 guava를 사용하고 있습니다.기본적으로 개발해야 할 Greenfield Java 라이브러리가 있어서 J2SE API에 가장 적합한 부속 라이브러리를 찾아다녔습니다.이전에는 Apache Commons 라이브러리를 사용했지만, 저는 무엇이 있는지 보고 싶었고 Guava를 사용하기 시작했습니다.
장점
- Java 5.0 언어 구성라이브러리는 대부분의 디자인 신호를 Bloch의 "Effective Java: 2nd Edition"에서 가져온다.불변성, 빌더 패턴, 컨스트럭터 대신 공장, 제네릭 등이것에 의해, 코드의 내용이 보다 엄격해지고 표현력이 높아집니다.
- 기능 프로그래밍, 특히 최상위 수준의 기능 및 술어 인터페이스를 지원합니다.
단점
- Apache Commons, 특히 Commons-codec을 충분히 대체할 수 없습니다.
- 구아바 요리책은 없다.도서관은 최소적이고 직교적이다.따라서, 그것을 최대한 활용할 수 있는 확실한 학습 곡선이 있습니다.앞서 설명한 바와 같이 Javadoc은 훌륭하지만 좀 더 긴 소스 코드 사례 연구가 도움이 될 것입니다.
- Java 1.3 또는 1.4가 필요한 환경에서는 운이 없습니다.
Guava는 Java가 간결하고 표현력이 풍부한 스크립트 언어에 가깝다고 느끼게 합니다.그것은 훌륭합니다.
내 경험상, 나는 그들이 서로 다투거나 구아바가 아파치 립을 개선한다는 것을 알지 못한다.오히려 guava는 아파치 립을 보완합니다.guava에는 apache에 없는 클래스와 유틸리티가 있습니다.
따라서, 그 자체를 바꿀 필요가 있는지는 잘 모르겠습니다. "적절한 업무에 적합한 도구를 사용하세요."라고 말하고 싶습니다.
언급URL : https://stackoverflow.com/questions/4542550/what-are-the-big-improvements-between-guava-and-apache-equivalent-libraries
'programing' 카테고리의 다른 글
| Python에서 열 이름을 사용하여 SQL 결과 열 값을 검색하는 방법은 무엇입니까? (0) | 2023.01.06 |
|---|---|
| Composer에서 패키지를 전체적으로 제거하려면 어떻게 해야 합니까? (0) | 2023.01.06 |
| JPA: 동일한 엔티티 유형의 일대다 관계를 갖는 방법 (0) | 2023.01.06 |
| C에서 문자 배열의 첫 번째 요소로 \0을 정의하는 이유는 무엇입니까? (0) | 2023.01.06 |
| HTTP를 통한 리모트서버로부터의 이미지 복사 (0) | 2023.01.06 |