nullチェック

以下のようなDaoがあります。

public interface EmployeeDao {
    public static final Class BEAN = Employee.class;

    public static final String getById_ARGS = "id";
    public Employee getById(Long id);

    public static final String getByName_ARGS = "name";
    public List getByName(String name);

    public void delete(Employee employee);
}

このDaoを使って、次のようなメソッドを書いたとします。

public void deleteEmployee(Long id) {
    Employee employee = employeeDao.getById(id); // (1)
    employeeDao.delete(employee); // (2)
}

public boolean containsEmployee(String name) {
    return !employeeDao.getByName(name).isEmpty();
}

この2つのメソッドに、それぞれnullが渡されて呼ばれたとします。結果を直感的に想像すると

  • deleteEmployee(null) → (1)でnullが返り、(2)で例外発生
  • containsEmployee(null) → falseが返る

となります。ところが、EmployeeDaoの各検索系メソッドにnullが渡ると、全件取得クエリーが発行されます。そのため、実際の結果は

  • deleteEmployee(null) → テーブルの1行目が削除される
  • containsEmployee(null) → trueが返る

となります。

このように、Daoの呼び出し前に引数のnullチェックをしておかないと、不可解な挙動に悩まされる可能性があるので注意が必要だと思います。