実務では「ソート処理を毎回書き捨てる」のではなく、ユーティリティメソッド化して再利用するのが定石です。これにより、複数のサービスや画面で同じソートロジックを使い回せ、テストも容易になります。
基本方針
- Utilityクラスを作成し、
staticメソッドとしてソート処理をまとめる。 - 利用側は
SortUtils.sortByXxx(list)のように呼び出すだけ。 - Comparator を内部で定義することで、複雑な条件も隠蔽できる。
サンプルコード
エンティティ
class Employee {
private String department;
private int age;
private String name;
public Employee(String department, int age, String name) {
this.department = department;
this.age = age;
this.name = name;
}
public String getDepartment() { return department; }
public int getAge() { return age; }
public String getName() { return name; }
@Override
public String toString() {
return department + " - " + age + " - " + name;
}
}
Javaユーティリティクラス
import java.util.*;
public class SortUtils {
// 部署 → 年齢 → 名前 の昇順ソート
public static void sortByDepartmentAgeName(List<Employee> employees) {
employees.sort(
Comparator.comparing(Employee::getDepartment)
.thenComparing(Employee::getAge)
.thenComparing(Employee::getName)
);
}
// 年齢の降順ソート
public static void sortByAgeDesc(List<Employee> employees) {
employees.sort(Comparator.comparingInt(Employee::getAge).reversed());
}
// 名前昇順ソート
public static void sortByName(List<Employee> employees) {
employees.sort(Comparator.comparing(Employee::getName));
}
}
Java利用側
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Sales", 30, "Tanaka"),
new Employee("HR", 25, "Sato"),
new Employee("Sales", 25, "Suzuki"),
new Employee("HR", 30, "Kato"),
new Employee("Sales", 30, "Ando")
);
// 部署→年齢→名前でソート
SortUtils.sortByDepartmentAgeName(employees);
System.out.println("部署→年齢→名前:");
employees.forEach(System.out::println);
// 年齢降順でソート
SortUtils.sortByAgeDesc(employees);
System.out.println("\n年齢降順:");
employees.forEach(System.out::println);
}
}
Javaテスト可能性
- ユーティリティメソッドを単体テストで検証可能。
- 例: JUnit で
sortByAgeDescを呼び出し、期待通りの順序になるか確認。
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import java.util.*;
public class SortUtilsTest {
@Test
void testSortByAgeDesc() {
List<Employee> employees = Arrays.asList(
new Employee("HR", 25, "Sato"),
new Employee("Sales", 30, "Tanaka")
);
SortUtils.sortByAgeDesc(employees);
assertEquals(30, employees.get(0).getAge());
assertEquals(25, employees.get(1).getAge());
}
}
Java実務メリット
- 再利用性: 複数のサービスや画面で同じソートロジックを使える。
- テスト容易性: ユーティリティ単位でテスト可能。
- 保守性: ソート条件を変更するときはユーティリティだけ修正すればよい。
