diff --git a/src/main/java/top/ellan/mahjong/table/core/DelimitedFingerprintBuilder.java b/src/main/java/top/ellan/mahjong/table/core/DelimitedFingerprintBuilder.java index 9262d93b..a6759671 100644 --- a/src/main/java/top/ellan/mahjong/table/core/DelimitedFingerprintBuilder.java +++ b/src/main/java/top/ellan/mahjong/table/core/DelimitedFingerprintBuilder.java @@ -15,12 +15,27 @@ public static DelimitedFingerprintBuilder create(int capacity) { } public DelimitedFingerprintBuilder field(Object value) { - if (this.needsSeparator) { - this.delegate.append(':'); - } + this.appendFieldSeparator(); this.delegate.append(Objects.toString(value, "")); - this.needsSeparator = true; - return this; + return this.finishField(); + } + + public DelimitedFingerprintBuilder field(boolean value) { + this.appendFieldSeparator(); + this.delegate.append(value); + return this.finishField(); + } + + public DelimitedFingerprintBuilder field(char value) { + this.appendFieldSeparator(); + this.delegate.append(value); + return this.finishField(); + } + + public DelimitedFingerprintBuilder field(int value) { + this.appendFieldSeparator(); + this.delegate.append(value); + return this.finishField(); } public DelimitedFingerprintBuilder raw(Object value) { @@ -34,6 +49,17 @@ public DelimitedFingerprintBuilder entrySeparator() { return this; } + private void appendFieldSeparator() { + if (this.needsSeparator) { + this.delegate.append(':'); + } + } + + private DelimitedFingerprintBuilder finishField() { + this.needsSeparator = true; + return this; + } + @Override public String toString() { return this.delegate.toString(); diff --git a/src/test/java/top/ellan/mahjong/table/core/DelimitedFingerprintBuilderTest.java b/src/test/java/top/ellan/mahjong/table/core/DelimitedFingerprintBuilderTest.java new file mode 100644 index 00000000..7d723c23 --- /dev/null +++ b/src/test/java/top/ellan/mahjong/table/core/DelimitedFingerprintBuilderTest.java @@ -0,0 +1,38 @@ +package top.ellan.mahjong.table.core; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DelimitedFingerprintBuilderTest { + @Test + void optimizedPrimitiveFieldsPreserveDelimitedTextAndObjectFallbacks() { + String fingerprint = DelimitedFingerprintBuilder.create(128) + .field((byte) -128) + .field((short) -32768) + .field(Integer.MIN_VALUE) + .field(Long.MIN_VALUE) + .field(1.25F) + .field(-0.0D) + .field('Z') + .field(true) + .field(false) + .field((Object) null) + .toString(); + + assertEquals("-128:-32768:-2147483648:-9223372036854775808:1.25:-0.0:Z:true:false:", fingerprint); + } + + @Test + void primitiveFieldsKeepRawAndEntrySeparatorSemantics() { + String fingerprint = DelimitedFingerprintBuilder.create(32) + .field(1) + .entrySeparator() + .field(false) + .raw("|") + .field((Object) null) + .toString(); + + assertEquals("1;false|:", fingerprint); + } +}