From 9655761ab15b1195189c884b096ebff3fd172994 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 9 Sep 2020 15:43:44 +0200 Subject: [PATCH] Micro-optimizations Walshy would be proud of --- .../items/androids/Instruction.java | 10 +++---- .../items/androids/ProgrammableAndroid.java | 4 +-- .../slimefun4/utils/tags/SlimefunTag.java | 30 +++++++++++++++++++ .../slimefun4/utils/tags/TagParser.java | 11 +++---- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/Instruction.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/Instruction.java index e80029472..429821dc4 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/Instruction.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/Instruction.java @@ -148,16 +148,16 @@ enum Instruction { private static final Map nameLookup = new HashMap<>(); public static final Instruction[] values = values(); - private final ItemStack item; - private final AndroidType type; - private final AndroidAction method; - static { for (Instruction instruction : values) { nameLookup.put(instruction.name(), instruction); } } + private final ItemStack item; + private final AndroidType type; + private final AndroidAction method; + @ParametersAreNonnullByDefault Instruction(AndroidType type, HeadTexture head, @Nullable AndroidAction method) { this.type = type; @@ -198,7 +198,7 @@ enum Instruction { * @return The {@link Instruction} or null if it does not exist. */ @Nullable - public static Instruction getFromCache(@Nonnull String value) { + public static Instruction getInstruction(@Nonnull String value) { Validate.notNull(value, "An Instruction cannot be null!"); return nameLookup.get(value); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java index 096abbf8e..ddd070463 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java @@ -255,7 +255,7 @@ public class ProgrammableAndroid extends SlimefunItem implements InventoryBlock, }); } else { - Instruction instruction = Instruction.getFromCache(script[i]); + Instruction instruction = Instruction.getInstruction(script[i]); if (instruction == null) { SlimefunPlugin.instance().getLogger().log(Level.WARNING, "Failed to parse Android instruction: {0}, maybe your server is out of date?", script[i]); @@ -655,7 +655,7 @@ public class ProgrammableAndroid extends SlimefunItem implements InventoryBlock, } BlockStorage.addBlockInfo(b, "fuel", String.valueOf(fuel - 1)); - Instruction instruction = Instruction.getFromCache(script[index]); + Instruction instruction = Instruction.getInstruction(script[index]); if (instruction == null) { SlimefunPlugin.instance().getLogger().log(Level.WARNING, "Failed to parse Android instruction: {0}, maybe your server is out of date?", script[index]); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java index e78e3834e..edeb7a241 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java @@ -1,13 +1,17 @@ package io.github.thebusybiscuit.slimefun4.utils.tags; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Locale; +import java.util.Map; import java.util.Set; import java.util.stream.Stream; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.apache.commons.lang.Validate; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.Tag; @@ -107,6 +111,15 @@ public enum SlimefunTag implements Tag { */ CLIMBING_PICK_SURFACES; + private static final Map nameLookup = new HashMap<>(); + public static final SlimefunTag[] values = values(); + + static { + for (SlimefunTag tag : values) { + nameLookup.put(tag.name(), tag); + } + } + private final NamespacedKey key; private final Set includedMaterials = new HashSet<>(); private final Set> additionalTags = new HashSet<>(); @@ -210,4 +223,21 @@ public enum SlimefunTag implements Tag { return getValues().stream(); } + /** + * Get a value from the cache map rather than calling {@link Enum#valueOf(Class, String)}. + * This is 25-40% quicker than the standard {@link Enum#valueOf(Class, String)} depending on + * your Java version. It also means that you can avoid an IllegalArgumentException which let's + * face it is always good. + * + * @param value + * The value which you would like to look up. + * + * @return The {@link SlimefunTag} or null if it does not exist. + */ + @Nullable + public static SlimefunTag getTag(@Nonnull String value) { + Validate.notNull(value, "A tag cannot be null!"); + return nameLookup.get(value); + } + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/TagParser.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/TagParser.java index 120af665b..e15947a79 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/TagParser.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/TagParser.java @@ -162,13 +162,14 @@ public class TagParser implements Keyed { } } else if (PatternUtils.SLIMEFUN_TAG.matcher(value).matches()) { - try { - // Get a SlimefunTag enum value for the given key - String keyValue = PatternUtils.COLON.split(value)[1].toUpperCase(Locale.ROOT); - SlimefunTag tag = SlimefunTag.valueOf(keyValue); + // Get a SlimefunTag enum value for the given key + String keyValue = PatternUtils.COLON.split(value)[1].toUpperCase(Locale.ROOT); + SlimefunTag tag = SlimefunTag.getTag(keyValue); + + if (tag != null) { tags.add(tag); } - catch (IllegalArgumentException x) { + else { throw new TagMisconfigurationException(key, "There is no '" + value + "' tag in Slimefun"); } }