From c44b874b41e6efb6911bb0a3574947dd38f6c7e1 Mon Sep 17 00:00:00 2001 From: tueem Date: Fri, 11 Apr 2025 13:44:10 +0200 Subject: [PATCH] feat(method): add Factory to BestCandidateMethod --- .../cutin/method/BestCandidateMethod.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java b/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java index 4d629e9..a09dd39 100644 --- a/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java +++ b/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java @@ -3,8 +3,12 @@ package net.tomatentum.cutin.method; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.stream.Stream; +import net.tomatentum.cutin.ReflectedMethodFactory; +import net.tomatentum.cutin.container.MethodContainer; import net.tomatentum.cutin.util.ReflectionUtil; public class BestCandidateMethod extends ReflectedMethod { @@ -20,6 +24,13 @@ public class BestCandidateMethod extends ReflectedMethod { this.additionalParameters = Arrays.asList(additionalParameters); } + public BestCandidateMethod(String methodName, Object containingObject, Object... additionalParameters) { + super(getMethod(containingObject, methodName), containingObject); + this.methodName = methodName; + this.identifier = null; + this.additionalParameters = Arrays.asList(additionalParameters); + } + @Override public Object getParameter(Object context, int index) { return additionalParameters.get(index); @@ -49,5 +60,42 @@ public class BestCandidateMethod extends ReflectedMethod { .filter(m -> m.getName().equals(methodName)) .findFirst().orElse(null); } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BestCandidateMethod bcMethod) { + return this.containingObject().getClass().equals(bcMethod.containingObject().getClass()) && + this.methodName.equals(bcMethod.methodName); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(containingObject.getClass(), methodName); + } + + public abstract static class Factory implements ReflectedMethodFactory.Factory { + + private MethodContainer methodContainer; + private String methodName; + private Object[] additionalParameters; + + protected Factory(MethodContainer methodContainer, String methodName, Object... additionalParameters) { + this.methodContainer = methodContainer; + this.methodName = methodName; + this.additionalParameters = additionalParameters; + } + + @Override + public Optional> produce(Method method, Object containingObject) { + BestCandidateMethod bcMethod = new BestCandidateMethod<>( + methodName, containingObject, additionalParameters); + if (methodContainer.methods().contains(bcMethod)) + return Optional.empty(); + return Optional.of(bcMethod); + } + + } }