일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- FLUTTER
- Kotlin
- 알고리즘
- RxJava
- 코틀린
- C/C++
- C
- 프로그래머스
- Django REST framework
- Java
- livedata
- RxAndroid
- dart
- Django REST Android
- kodility
- C++
- NDK
- flutter firestore
- 안드로이드 구글맵
- Flutter TextField
- Python
- mfc
- Django REST
- 안드로이드
- UWP
- android push
- Android
- Android P
- Rxjava2
- android architecture component
- Today
- Total
개발하는 두더지
[Effective Java 규칙12] Comparable 구현을 고려하라 본문
[Effective Java 규칙12] Comparable 구현을 고려하라
Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다.
Comparable 인터페이스에 포함된 유일한 메서드이고, 이를 구현한 클래스는 순서를 가지게 된다. 또한 검색하거나 최대/최소치를 계산하기도 간단하고, 그 컬렉션을 정렬된 상태로 유지하기도 쉽다. 그리고 다양한 제네릭 알고리즘 및 Comparable 인터페이스를 이용하도록 작성된 컬렉션 구현체와도 전부 연동할 수 있다.
만능??
자바 플랫폼 라이브러리에 포함된 거의 모든 값 클래스는 Comparable 인터페이스를 구현한다. 알파벳 순서나 값의 크기, 시간적 선후관계처럼 명확한 순서를 따르는 값 클래스를 구현할 때는 Comparable 인터페이스를 구현할 것을 반드시 고려해야 한다.
물론 여기에도 지켜야할 규약이 존재하지만 수학적으로 순서가 존재하기만 한다면 문제될 것은 없다. 그리고 equals는 다른 클래스 객체에도 적용이 되야 하는데 ( 상속받은 경우 상위/하위 클래스 고려) Comparable은 같은 객체끼리만 비교하면 된다.
그리고 equals처럼 Comparable 인터페이스를 구현한 원래 클래스를 상속하고 필드를 추가하여 확장하는 방식보다는 원래 클래스를 필드로 포함하는 새로운 클래스를 만들어 사용하면 규약들을 지키면서 안전하게, 문제없이 확장할 수 있다.
아래는 Comparable을 구현하여 회원의 이름과 상태를 정렬하는 예제이다
상태를 우선으로 정렬하고 이름은 오름차순으로 정렬한다.
public class Member implements Comparable<Member>{
static enum Status {
NORMAL(1), FRIEND(2), BANNED(3);
private final int order;
Status(int order) {
this.order = order;
}
public int getOrder() {
return this.order;
}
}
private final String name;
private final Status status;
public Member(final String name, final Status status) {
this.name = name;
this.status = status;
}
@Override
public int compareTo(Member member) {
if(this.status.equals(member.status)) {
return this.name.compareTo(member.name);
} else {
return this.status.compareTo(member.status);
}
}
@Override
public String toString() {
return "Member [name=" + name + ", status=" + status + "]";
}
}
public static void main(String[] args) {
Member[] members = {
new Member("abrt", Member.Status.FRIEND),
new Member("dfgh", Member.Status.FRIEND),
new Member("abdf", Member.Status.NORMAL),
new Member("wert", Member.Status.NORMAL),
new Member("zandgh", Member.Status.BANNED),
new Member("qwer", Member.Status.BANNED)
};
List<Member> list = Arrays.asList(members);
Collections.sort(list);
System.out.println(list);
}
결과는 아래와 같다.
[Member [name=abdf, status=NORMAL]
, Member [name=wert, status=NORMAL]
, Member [name=abrt, status=FRIEND]
, Member [name=dfgh, status=FRIEND]
, Member [name=qwer, status=BANNED]
, Member [name=zandgh, status=BANNED]
]
'Java,Android' 카테고리의 다른 글
[Effective Java 규칙15] 변경 가능성을 최소하하라 (0) | 2018.09.14 |
---|---|
[Effective Java 규칙13] 클래스와 멤버의 접근 권한은 최소화하라 (0) | 2018.09.14 |
[Effective Java 규칙11] clone을 재정의할 때는 신중하라 (0) | 2018.09.14 |
[Effective Java 규칙9] equals를 재정의할 때는 반드시 hashCode도 재정의하라 (0) | 2018.09.14 |
[Effective Java 규칙8] equals를 재정의할 때는 일반 규약을 따르라 (0) | 2018.09.14 |