Improves efficiency when appending many strings to a format builder
All checks were successful
KnarCraft/KnarLib/pipeline/head This commit looks good

This commit is contained in:
2025-09-13 16:31:02 +02:00
parent b106e33732
commit b9c06728a8
2 changed files with 38 additions and 20 deletions

View File

@@ -20,13 +20,14 @@ public final class FormatBuilder {
private static @Nullable StringFormatter stringFormatter = null;
private static final IllegalStateException NOT_SETUP_EXCEPTION = new IllegalStateException("String formatter has not been set!");
private static final String LIST_DELIMITER = ",";
private @NotNull String toFormat;
private StringBuilder stringBuilder = null;
private @NotNull String stringToFormat;
/**
* Instantiates a new format builder
*/
public FormatBuilder() {
this.toFormat = "";
this.stringToFormat = "";
}
/**
@@ -38,7 +39,7 @@ public final class FormatBuilder {
* @throws IllegalStateException <p>If the string formatter has not been set, and the input is a translatable message</p>
*/
public <K> FormatBuilder(@NotNull K input) throws IllegalStateException {
this.toFormat = asString(input, LIST_DELIMITER);
this.stringToFormat = asString(input, LIST_DELIMITER);
}
/**
@@ -49,7 +50,7 @@ public final class FormatBuilder {
* @throws IllegalStateException <p>If the string formatter has not been set, and the input is a translatable message</p>
*/
public <K> FormatBuilder(@NotNull K input, @NotNull String delimiter) throws IllegalStateException {
this.toFormat = asString(input, delimiter);
this.stringToFormat = asString(input, delimiter);
}
/**
@@ -70,7 +71,7 @@ public final class FormatBuilder {
*/
@NotNull
public FormatBuilder replace(@NotNull List<String> placeholders, @NotNull List<String> replacements) {
this.toFormat = StringFormatter.replacePlaceholders(this.toFormat, placeholders, replacements);
this.stringToFormat = StringFormatter.replacePlaceholders(getCurrentString(), placeholders, replacements);
return this;
}
@@ -83,7 +84,7 @@ public final class FormatBuilder {
*/
@NotNull
public FormatBuilder replace(@NotNull String[] placeholders, @NotNull String[] replacements) {
this.toFormat = StringFormatter.replacePlaceholders(this.toFormat, placeholders, replacements);
this.stringToFormat = StringFormatter.replacePlaceholders(getCurrentString(), placeholders, replacements);
return this;
}
@@ -100,9 +101,7 @@ public final class FormatBuilder {
*/
@NotNull
public <K, L> FormatBuilder replace(@NotNull K placeholder, @NotNull L replacement) throws IllegalStateException {
this.toFormat = StringFormatter.replacePlaceholder(this.toFormat, asString(placeholder, LIST_DELIMITER),
asString(replacement, LIST_DELIMITER));
return this;
return replace(placeholder, replacement, LIST_DELIMITER);
}
/**
@@ -118,7 +117,7 @@ public final class FormatBuilder {
@NotNull
public <K, L> FormatBuilder replace(@NotNull K placeholder, @NotNull L replacement,
@NotNull String delimiter) throws IllegalStateException {
this.toFormat = StringFormatter.replacePlaceholder(this.toFormat, asString(placeholder, LIST_DELIMITER),
this.stringToFormat = StringFormatter.replacePlaceholder(getCurrentString(), asString(placeholder, LIST_DELIMITER),
asString(replacement, delimiter));
return this;
}
@@ -131,7 +130,7 @@ public final class FormatBuilder {
*/
@NotNull
public FormatBuilder replace(@NotNull StringReplacer stringReplacer) {
this.toFormat = stringReplacer.replace(this.toFormat);
this.stringToFormat = stringReplacer.replace(getCurrentString());
return this;
}
@@ -149,7 +148,7 @@ public final class FormatBuilder {
if (FormatBuilder.stringFormatter == null) {
throw NOT_SETUP_EXCEPTION;
}
this.toFormat = FormatBuilder.stringFormatter.getUnFormattedColoredMessage(this.toFormat);
this.stringToFormat = FormatBuilder.stringFormatter.getUnFormattedColoredMessage(getCurrentString());
return this;
}
@@ -163,7 +162,7 @@ public final class FormatBuilder {
* @return <p>This format builder</p>
*/
public FormatBuilder color(@NotNull ColorConversion colorConversion) {
this.toFormat = ColorHelper.translateColorCodes(this.toFormat, colorConversion);
this.stringToFormat = ColorHelper.translateColorCodes(getCurrentString(), colorConversion);
return this;
}
@@ -178,8 +177,7 @@ public final class FormatBuilder {
*/
@NotNull
public <K> FormatBuilder append(@NotNull K input) throws IllegalStateException {
this.toFormat += asString(input, LIST_DELIMITER);
return this;
return append(input, LIST_DELIMITER);
}
/**
@@ -192,7 +190,10 @@ public final class FormatBuilder {
*/
@NotNull
public <K> FormatBuilder append(@NotNull K input, @NotNull String delimiter) throws IllegalStateException {
this.toFormat += asString(input, delimiter);
if (this.stringBuilder == null) {
this.stringBuilder = new StringBuilder();
}
this.stringBuilder.append(asString(input, delimiter));
return this;
}
@@ -206,7 +207,7 @@ public final class FormatBuilder {
if (FormatBuilder.stringFormatter == null) {
throw NOT_SETUP_EXCEPTION;
}
FormatBuilder.stringFormatter.displaySuccessMessage(commandSender, this.toFormat);
FormatBuilder.stringFormatter.displaySuccessMessage(commandSender, getCurrentString());
}
/**
@@ -219,7 +220,7 @@ public final class FormatBuilder {
if (FormatBuilder.stringFormatter == null) {
throw NOT_SETUP_EXCEPTION;
}
FormatBuilder.stringFormatter.displayErrorMessage(commandSender, this.toFormat);
FormatBuilder.stringFormatter.displayErrorMessage(commandSender, getCurrentString());
}
/**
@@ -232,13 +233,26 @@ public final class FormatBuilder {
if (FormatBuilder.stringFormatter == null) {
throw NOT_SETUP_EXCEPTION;
}
FormatBuilder.stringFormatter.displayNeutralMessage(commandSender, this.toFormat);
FormatBuilder.stringFormatter.displayNeutralMessage(commandSender, getCurrentString());
}
@NotNull
@Override
public String toString() {
return this.toFormat;
return getCurrentString();
}
/**
* Gets the currently generated string
*
* @return <p>The current string</p>
*/
private String getCurrentString() {
if (this.stringBuilder != null) {
this.stringToFormat += this.stringBuilder.toString();
this.stringBuilder = null;
}
return this.stringToFormat;
}
/**

View File

@@ -38,6 +38,10 @@ public class FormatBuilderTest {
assertEquals("Test1,2,3,4,5abck z", builder.toString());
builder.append(List.of(ParticleMode.SINGLE, ParticleMode.CIRCLE, ParticleMode.CUBE));
assertEquals("Test1,2,3,4,5abck zSINGLE,CIRCLE,CUBE", builder.toString());
for (int i = 0; i < 10; i++) {
builder.append(i);
}
assertEquals("Test1,2,3,4,5abck zSINGLE,CIRCLE,CUBE0123456789", builder.toString());
}
}