# 검사가 선언하는 범위 *

The check is structural and conservative: records, enums, strings, boxed primitives and * immutable collection views replay; anything else is treated as one-shot, so the retry engine * refuses rather than gambling. A caller who knows better can freeze the value itself — serialize * it to a {@code byte[]} body — which states the guarantee instead of asserting it. */ # 첫 분기 private static boolean deeplyImmutable(Object candidate) { if (candidate == null) { return true; } if (candidate instanceof String || candidate instanceof Number || candidate instanceof Boolean || candidate instanceof Character || candidate instanceof Enum || candidate instanceof java.util.UUID || candidate instanceof java.time.temporal.Temporal) { return true; } # 이 검사가 존재하는 이유 (test 클래스 javadoc) /** * Replayability is a property of the value, not a promise in a javadoc. * *

Every {@code ObjectBody} used to report {@code REPLAYABLE}. A caller who reused a builder or * kept a reference to a list therefore got a retry that re-encoded the value as it was at retry * time — different bytes, same idempotency key, which is precisely what a replay must never * be. */ # 그 이유를 고정하는 test 넷 28: @DisplayName("a record of immutable components replays") 29: void anImmutableRecordReplays() { 41: @DisplayName("a value the caller can still mutate does not replay") 42: void aMutableValueIsOneShot() { 51: @DisplayName("a record wrapping a mutable component does not replay") 52: void aRecordWrappingMutableStateIsOneShot() { 66: @DisplayName("an uninspectable value is one-shot") 67: void anArbitraryBeanIsOneShot() {