이 기사는 클린 코드 원칙에 대한 무료 Java 8 과정의 일부입니다.
이번 글에서는 Java Comparable인터페이스에 대해 이야기해보겠습니다.
여기를 클릭하시면 좋은 동영상도 보실 수 있습니다.
어떻게 비교하고 주문해야 할까요? 이 질문이 다소 혼란스럽게 들릴 수도 있지만, 진지하게 생각해보시길 바랍니다. 예를 들어 사과 그룹이 있습니다.
예 1
어떻게 정렬합니까? 무게별로 정렬해 볼까요? 그렇다면 가장 가벼운 것부터 가장 무거운 것까지, 아니면 가장 무거운 것부터 가장 가벼운 것까지 정렬되어 있습니까? 사과를 정렬할 때 모든 사과가 올바르게 정렬될 때까지 두 사과의 무게를 반복적으로 비교해야 합니다. Apple 1이 Apple 2보다 무겁습니까? 그럼 아이폰3보다 무겁나요? 정렬이 완료될 때까지 계속 비교해야 합니다. Comparable 인터페이스는 이 목표를 달성하는 데 도움이 될 수 있습니다. Comparable 자체는 객체 를 정렬할 수 없지만 인터페이스에 정의된 int CompareTo(T) 메서드는 정렬할 수 있습니다.
CompareTo() 메서드를 사용하여 어떤 사과가 더 무거운지 살펴보겠습니다.
예제 2
CompareTo() 메서드는 int 값(양수, 음수 또는 0)을 반환하여 작동합니다. 객체를 인수로 호출하여 객체를 비교합니다. 음수는 호출되는 객체가 인수보다 "가벼움"을 나타냅니다. 사과를 크기별로 비교하는 경우 빨간색 사과가 녹색 사과보다 작기 때문에 위 호출은 -400과 같은 음수를 반환합니다. 두 사과의 무게가 같으면 호출은 0을 반환합니다. 빨간 사과가 더 무거우면 CompareTo()는 68과 같은 양수를 반환합니다.
위의 CompareTo() 메서드를 반복해서 호출하면 크기별로 정렬할 수 있는데, 이는 훌륭하지만 이야기가 끝나지는 않습니다. 사과를 색깔별로 분류하고 싶다면 어떻게 해야 할까요? 아니면 무게인가요? 우리도 할 수 있습니다. 요점은 우리 클라이언트(그를 Fat Farmer라고 부르겠습니다(예 3 참조))가 개발을 시작하기 전에 사과를 어떻게 분류해야 하는지 정확히 정의해야 한다는 것입니다.
예 3
그는 다음 두 질문에 대답하여 이를 수행할 수 있습니다.
그는 어떻게 하시겠습니까? 정렬할 애플? 그는 우리가 어떤 특성을 비교하기를 원합니까?
그런 맥락에서 '보다 작음', '같음', '보다 큼'은 무엇을 의미하나요?
여러 기능을 사용할 수도 있으며 이에 대해서는 나중에 설명하겠습니다.
이 첫 번째 예에서는 사과를 무게별로 정렬하겠습니다. 필요한 것은 코드 한 줄뿐입니다.
Collections.sort(apples);
예 4
사과를 정렬하는 방법을 미리 정의하기만 하면 위의 코드 줄은 모든 정렬 작업을 수행할 수 있습니다(여러 줄의 코드가 필요함).
사과 카테고리 작성을 시작해 보겠습니다.
public class Apple implements Comparable { private String variety; private Color color; private int weight; @Override public int compareTo(Apple other) { if (this.weight < other.weight) { return -1; } if (this.weight == other.weight) { return 0; } return 1; } }
예제 5
Apple 클래스의 첫 번째 버전입니다. CompareTo 메서드를 사용하고 사과를 정렬하고 있으므로 Comparable 인터페이스를 구현했습니다. 첫 번째 버전에서는 물체를 무게별로 비교합니다. CompareTo() 메서드에서는 이 사과의 무게가 다른 사과보다 작으면 음수를 반환한다는 if 조건을 작성합니다. 이를 간단하게 유지하기 위해 -1이라고 가정합니다. 이는 이 Apple이 Apple '다른' 것보다 가볍다는 것을 의미합니다. 두 번째 if 문에서는 사과의 무게가 같으면 0이 반환된다고 명시하고 있습니다. 물론, 이 사과가 가볍지도, 똑같이 무겁지도 않다면, 그것은 다른 사과들보다 더 무거울 수밖에 없습니다. 이 경우 1로 가정하여 양수를 반환합니다.
正如我前面提到的,我们还可以使用compareTo()比较多个特征。比方说,我们第一通过品种排序苹果,但如果两个苹果是同一品种,那么我们就按颜色排序。最后,如果这两个特性相同,那么我们将按重量排序。虽然我们可以手动实现这件事,就像我在最后一个例子中做的那样,但是其实可以用一种简洁得多的方式实现。一般来说,最好是重用现有的代码,而不是自己写。我们可以在Integer、String和枚举类中使用compareTo方法来比较值。由于我们没有使用Integer对象,用了int,所以我们不得不使用来自于Integer包装器类的一个静态的helper方法来比较两个值。
public class Apple implements Comparable { private String variety; private Color color; private int weight; @Override public int compareTo(Apple other) { int result = this.variety.compareTo(other.variety); if (result != 0) { return result; } if (result == 0) { result = this.color.compareTo(other.color); } if (result != 0) { return result; } if (result == 0) { result = Integer.compare(this.weight, other.weight); } return result; } }
例6
在例6中,我们比较了客户指定的苹果的第一特性,它们的品种。如果compareTo()调用的结果为非零,那么我们返回值。否则,我们调用另一个compareTo()直到得到一个非零值,或者直到已经比较完这三个特征。尽管此代码可以工作,但它不是最有效或干净的解决方案。在例3中,我们重构我们的代码,使其更简单。
@Override public int compareTo(Apple other) { int result = this.variety.compareTo(other.variety); if (result == 0) { result = this.color.compareTo(other.color); } if (result == 0) { result = Integer.compare(this.weight, other.weight); } return result; }
例7
正如你所看到的,这大大减少了代码,并且每一次比较只要一行代码。如果一个compareTo()调用的结果是零,那么我们就转移到下一个相同if语句的比较中。顺便说一句,这是成为Clean Coder的一个很好的例子。通常情况下,你不需要立即写出干净的代码;你可以从一个粗略的想法开始,使其可以工作,然后不断改进,直到你尽可能得让它干净就可以了。
你可能会注意到compareTo()看起来有点像hashCode()和equals()方法。但是,它们有一个重要的区别。对于hashCode()和equals()方法,比较个体属性的顺序不影响返回的值,但是,在compareTo()中,通过你比较对象的顺序来定义对象的顺序。
在结论中我只想强调Comparable接口是多么的重要。它既用于java.util.Arrays,也用于java.util.Collections实用程序类,来排序元素和搜索排序集合中的元素。使用TreeSet和Tree Map,就更简单了——想要它们会自动排序必须实现Comparable接口的元素。
위 내용은 Java Comparable 인터페이스의 샘플 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!