Java | ソートをユーティリティメソッドとして再利用化

Java Java
スポンサーリンク

実務では「ソート処理を毎回書き捨てる」のではなく、ユーティリティメソッド化して再利用するのが定石です。これにより、複数のサービスや画面で同じソートロジックを使い回せ、テストも容易になります。


基本方針

  • 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

実務メリット

  • 再利用性: 複数のサービスや画面で同じソートロジックを使える。
  • テスト容易性: ユーティリティ単位でテスト可能。
  • 保守性: ソート条件を変更するときはユーティリティだけ修正すればよい。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました