Collections
HashMap: get のnullだけでは未登録とnull値を区別できない
HashMapはnull値を保存できるため、getの戻り値がnullでもキーが存在しないとは限りません。
SourceNullValues.java
Java 21
package examples.map;
import java.util.HashMap;
import java.util.Map;
public final class NullValues {
private NullValues() {}
public static Map<String, String> withNullValue() {
Map<String, String> values = new HashMap<>();
values.put("configured", null);
return values;
}
}TestNullValuesTest.java
Java 21
package examples.map;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class NullValuesTest {
@Test
void getだけではnull値のキーと未登録キーを区別できない() {
var values = NullValues.withNullValue();
assertNull(values.get("configured"));
assertNull(values.get("missing"));
assertTrue(values.containsKey("configured"));
assertFalse(values.containsKey("missing"));
}
}01Assertion
このテストで確認できること
- null値の登録済みキーも未登録キーもgetではnullを返す
- containsKeyでキーの存在を区別できる
nullを値として許すMapでは、getのnullだけを未登録判定に使いません。containsKeyまたは値の設計を明示します。
OBSERVED RESULT
expected: get(configured) → null
actual: null
expected: containsKey(configured) → true
actual: true