Skip to content

Commit 28300f7

Browse files
perf(core): avoid primitive fingerprint boxing (#61)
Co-authored-by: Arbousier1 <elderli@foxmail.com>
1 parent bc432da commit 28300f7

2 files changed

Lines changed: 69 additions & 5 deletions

File tree

src/main/java/top/ellan/mahjong/table/core/DelimitedFingerprintBuilder.java

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,27 @@ public static DelimitedFingerprintBuilder create(int capacity) {
1515
}
1616

1717
public DelimitedFingerprintBuilder field(Object value) {
18-
if (this.needsSeparator) {
19-
this.delegate.append(':');
20-
}
18+
this.appendFieldSeparator();
2119
this.delegate.append(Objects.toString(value, ""));
22-
this.needsSeparator = true;
23-
return this;
20+
return this.finishField();
21+
}
22+
23+
public DelimitedFingerprintBuilder field(boolean value) {
24+
this.appendFieldSeparator();
25+
this.delegate.append(value);
26+
return this.finishField();
27+
}
28+
29+
public DelimitedFingerprintBuilder field(char value) {
30+
this.appendFieldSeparator();
31+
this.delegate.append(value);
32+
return this.finishField();
33+
}
34+
35+
public DelimitedFingerprintBuilder field(int value) {
36+
this.appendFieldSeparator();
37+
this.delegate.append(value);
38+
return this.finishField();
2439
}
2540

2641
public DelimitedFingerprintBuilder raw(Object value) {
@@ -34,6 +49,17 @@ public DelimitedFingerprintBuilder entrySeparator() {
3449
return this;
3550
}
3651

52+
private void appendFieldSeparator() {
53+
if (this.needsSeparator) {
54+
this.delegate.append(':');
55+
}
56+
}
57+
58+
private DelimitedFingerprintBuilder finishField() {
59+
this.needsSeparator = true;
60+
return this;
61+
}
62+
3763
@Override
3864
public String toString() {
3965
return this.delegate.toString();
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package top.ellan.mahjong.table.core;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
7+
class DelimitedFingerprintBuilderTest {
8+
@Test
9+
void optimizedPrimitiveFieldsPreserveDelimitedTextAndObjectFallbacks() {
10+
String fingerprint = DelimitedFingerprintBuilder.create(128)
11+
.field((byte) -128)
12+
.field((short) -32768)
13+
.field(Integer.MIN_VALUE)
14+
.field(Long.MIN_VALUE)
15+
.field(1.25F)
16+
.field(-0.0D)
17+
.field('Z')
18+
.field(true)
19+
.field(false)
20+
.field((Object) null)
21+
.toString();
22+
23+
assertEquals("-128:-32768:-2147483648:-9223372036854775808:1.25:-0.0:Z:true:false:", fingerprint);
24+
}
25+
26+
@Test
27+
void primitiveFieldsKeepRawAndEntrySeparatorSemantics() {
28+
String fingerprint = DelimitedFingerprintBuilder.create(32)
29+
.field(1)
30+
.entrySeparator()
31+
.field(false)
32+
.raw("|")
33+
.field((Object) null)
34+
.toString();
35+
36+
assertEquals("1;false|:", fingerprint);
37+
}
38+
}

0 commit comments

Comments
 (0)