This is an automated email from the ASF dual-hosted git repository. sunlan pushed a commit to branch danielsun/tweak_closure in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 5f77243ab793c2a5de04f7b0b7db4c249910c8e3 Author: Daniel Sun <[email protected]> AuthorDate: Fri Dec 27 21:22:01 2024 +0900 Trivial refactoring: replace switch-case with map --- src/main/java/groovy/lang/Closure.java | 142 +++++++++++++++++---------------- 1 file changed, 74 insertions(+), 68 deletions(-) diff --git a/src/main/java/groovy/lang/Closure.java b/src/main/java/groovy/lang/Closure.java index 2bfe4cbe63..a2a76024c1 100644 --- a/src/main/java/groovy/lang/Closure.java +++ b/src/main/java/groovy/lang/Closure.java @@ -20,6 +20,7 @@ package groovy.lang; import org.apache.groovy.internal.util.UncheckedThrow; import org.apache.groovy.io.StringBuilderWriter; +import org.apache.groovy.util.Maps; import org.codehaus.groovy.reflection.ReflectionCache; import org.codehaus.groovy.reflection.stdclasses.CachedClosureClass; import org.codehaus.groovy.runtime.ComposedClosure; @@ -36,6 +37,9 @@ import org.codehaus.groovy.runtime.memoize.Memoize; import java.io.IOException; import java.io.Serializable; import java.io.Writer; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Function; /** * Represents any closure object in Groovy. @@ -203,6 +207,24 @@ public abstract class Closure<V> extends GroovyObjectSupport implements Cloneabl } }; + private static final Map<String, Function<Closure, Object>> PROPERTY_GETTERS = Maps.of( + "owner", Closure::getOwner, + "delegate", Closure::getDelegate, + "thisObject", Closure::getThisObject, + "class", Closure::getClass, + "metaClass", Closure::getMetaClass, + "directive", Closure::getDirective, + "parameterTypes", Closure::getParameterTypes, + "resolveStrategy", Closure::getResolveStrategy, + "maximumNumberOfParameters", Closure::getMaximumNumberOfParameters + ); + private static final Map<String, BiConsumer<Closure, Object>> PROPERTY_SETTERS = Maps.of( + "delegate", Closure::setDelegate, + "metaClass", (closure, value) -> closure.setMetaClass((MetaClass) value), + "directive", (closure, value) -> closure.setDirective((Integer) value), + "resolveStrategy", (closure, value) -> closure.setResolveStrategy((Integer) value) + ); + private Object delegate; private Object owner; private Object thisObject; @@ -277,43 +299,63 @@ public abstract class Closure<V> extends GroovyObjectSupport implements Cloneabl } @Override - public Object getProperty(final String property) { - switch (property) { - case "owner": - return getOwner(); - case "delegate": - return getDelegate(); - case "thisObject": - return getThisObject(); - case "class": - return getClass(); - case "metaClass": - return getMetaClass(); - case "directive": - return getDirective(); - case "parameterTypes": - return getParameterTypes(); - case "resolveStrategy": - return getResolveStrategy(); - case "maximumNumberOfParameters": - return getMaximumNumberOfParameters(); + public Object getProperty(final String property) { + Function<Closure, Object> getter = PROPERTY_GETTERS.get(property); + if (getter != null) { + return getter.apply(this); + } + + return resolveGetProperty(property); + } + + @Override + public void setProperty(final String property, final Object newValue) { + BiConsumer<Closure, Object> setter = PROPERTY_SETTERS.get(property); + if (setter != null) { + setter.accept(this, newValue); + return; } - switch(resolveStrategy) { - case DELEGATE_FIRST: - if (getDelegate() == null) return getProperty(getOwner(), property); - return getPropertyTryThese(getDelegate(), getOwner(), property); - case DELEGATE_ONLY: - return getProperty(getDelegate(), property); - case OWNER_ONLY: - return getProperty(getOwner(), property); - case TO_SELF: - return super.getProperty(property); - default: - return getPropertyTryThese(getOwner(), getDelegate(), property); + resolveSetProperty(property, newValue); + } + + private Object resolveGetProperty(final String property) { + switch (resolveStrategy) { + case DELEGATE_FIRST: + if (getDelegate() == null) return getProperty(getOwner(), property); + return getPropertyTryThese(getDelegate(), getOwner(), property); + case DELEGATE_ONLY: + return getProperty(getDelegate(), property); + case OWNER_ONLY: + return getProperty(getOwner(), property); + case TO_SELF: + return super.getProperty(property); + default: + return getPropertyTryThese(getOwner(), getDelegate(), property); } } + private void resolveSetProperty(final String property, final Object newValue) { + switch (resolveStrategy) { + case DELEGATE_FIRST: + if (getDelegate() == null) setProperty(getOwner(), property, newValue); + else setPropertyTryThese(getDelegate(), getOwner(), property, newValue); + break; + case DELEGATE_ONLY: + setProperty(getDelegate(), property, newValue); + break; + case OWNER_ONLY: + setProperty(getOwner(), property, newValue); + break; + case TO_SELF: + super.setProperty(property, newValue); + break; + default: + setPropertyTryThese(getOwner(), getDelegate(), property, newValue); + } + } + + private Object getProperty(final Object receiver, final String property) { try { return InvokerHelper.getProperty(receiver, property); @@ -345,42 +387,6 @@ public abstract class Closure<V> extends GroovyObjectSupport implements Cloneabl } } - @Override - public void setProperty(final String property, final Object newValue) { - switch (property) { - case "delegate": - setDelegate(newValue); - break; - case "metaClass": - setMetaClass((MetaClass) newValue); - break; - case "directive": - setDirective(((Number) newValue).intValue()); - break; - case "resolveStrategy": - setResolveStrategy(((Number) newValue).intValue()); - break; - default: - switch(resolveStrategy) { - case DELEGATE_FIRST: - if (getDelegate() == null) setProperty(getOwner(), property, newValue); - else setPropertyTryThese(getDelegate(), getOwner(), property, newValue); - break; - case DELEGATE_ONLY: - setProperty(getDelegate(), property, newValue); - break; - case OWNER_ONLY: - setProperty(getOwner(), property, newValue); - break; - case TO_SELF: - super.setProperty(property, newValue); - break; - default: - setPropertyTryThese(getOwner(), getDelegate(), property, newValue); - } - } - } - private void setProperty(final Object receiver, final String property, final Object newValue) { try { InvokerHelper.setProperty(receiver, property, newValue);
