自定义注解解决if/else过多问题
一个常见场景
import lombok.AllArgsConstructor;
import lombok.Data;
enum Action {
RUN,
EAT
}
class Animal {
public void run() {
System.out.println("animal run...");
}
public void eat() {
System.out.println("animal eat...");
}
}
@Data
@AllArgsConstructor
public class AnimalAction {
private Animal animal;
public void action(Action action) {
if (action == Action.RUN) {
animal.run();
} else if (action == Action.EAT) {
animal.eat();
}
}
}
自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.HashMap;
import java.util.Map;
import org.reflections.Reflections;
import lombok.AllArgsConstructor;
import lombok.Data;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface AnimalCommand {
public Action action();
}
interface AnimalBehavior {
public void behavior();
}
@AnimalCommand(action = Action.RUN)
class AnimalRunBehavior implements AnimalBehavior {
@Override
public void behavior() {
System.out.println("animal run...");
}
}
@AnimalCommand(action = Action.EAT)
class AnimalEatBehavior implements AnimalBehavior {
@Override
public void behavior() {
System.out.println("animal eat...");
}
}
@Data
@AllArgsConstructor
class AnimalAction {
public void action(Action action) {
mapping.get(action).behavior();
}
static Map<Action, AnimalBehavior> mapping = new HashMap<>();
static {
try {
Reflections reflections = new Reflections("com.javase.demo");
for(Class<?> clazz : reflections.getTypesAnnotatedWith(AnimalCommand.class)) {
AnimalCommand command = clazz.getAnnotation(AnimalCommand.class);
mapping.put(command.action(), (AnimalBehavior)clazz.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}