Heim > Java > javaLernprogramm > Hauptteil

So beseitigen Sie Switch-Case in Springboot

王林
Freigeben: 2023-05-14 19:49:04
nach vorne
1064 Leute haben es durchsucht

Die Grundlogik lautet wie folgt:

 String event = crsRequest.getEvent();
    CRSResponse crsResponse = null;
    switch (event) {
      case CRSRequestEvent.APP_START:
        crsResponse = processAppStartCommand(crsRequest);
        break;
      case CRSRequestEvent.INIT_COMPLETE:
        crsResponse = processInitCompleteCommand(crsRequest);
        break;
      case CRSRequestEvent.COLLECT_COMPLETE:
        crsResponse = processCollectCompleteCommand(crsRequest);
        break;
      case CRSRequestEvent.COLLECT_NO_INPUT:
        crsResponse = processCollectNoInputCommand(crsRequest);
        break;
      case CRSRequestEvent.PLAY_COMPLETE:
        crsResponse = processPlayCompleteCommand(crsRequest);
        break;
      default:
    }
Nach dem Login kopieren

Nachdem Sie es geschrieben haben, werden Sie feststellen, dass dieser Code mit zunehmender Anzahl von Ereignissen sehr lang wird und die Verarbeitungsfunktionen jedes einzelnen Auch die Konzentration von Ereignissen auf eine Klasse ist schwierig aufrechtzuerhalten. Daher haben wir durch Suchen und Lernen herausgefunden, dass wir Springboots Anmerkungen + Strategiemodus + einfache Fabrik verwenden können, um Switch-Case zu eliminieren.

Refactoring

Struktur definieren

public enum CRSEvent {
  APP_START("APP_START"),
  INIT_COMPLETE("INIT_COMPLETE"),
  PLAY_COMPLETE("PLAY_COMPLETE"),
  COLLECT_COMPLETE("COLLECT_COMPLETE"),
  COLLECT_NO_INPUT("COLLECT_NO_INPUT"),
  APP_END("APP_END"),
  RESP_ERROR_CMD("RESP_ERROR_CMD");

  private String event;

  CRSEvent(String event){
    this.event = event;
  }
  
  public String getEvent() {
    return event;
  }

  public void setEvent(String event) {
    this.event = event;
  }
}
Nach dem Login kopieren

Annotation definieren# 🎜🎜 #

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface CRSEventAnnotation {

  CRSEvent value();
}
Nach dem Login kopieren
Ereignisverarbeitungsschnittstelle definieren


public interface EventProcess {
  CRSResponse execute(CRSRequest resquest);
}
Nach dem Login kopieren
Alle Zeitverarbeitungsklassen müssen diese Schnittstelle implementieren. Darunter ist die Ausführung die Ereignisverarbeitungsmethode

Schreiben Sie eine bestimmte Zeitverarbeitungsklasse

Als nächstes schreiben Sie die Ereignisverarbeitung nacheinander Eine Klasse, nehmen Sie das folgende Beispiel:

@Component("appStartProcess")
@CRSEventAnnotation(value = CRSEvent.APP_START)
public class AppStartProcess implements EventProcess{

  @Override
  public CRSResponse execute(CRSRequest resquest) {
    CRSResponse response = new CRSResponse();
    response.setCommand(CRSResponseCmd.IVR_SESSION_INIT);
    CRSResponse.Message message = new CRSResponse.Message();
    message.setTts_vid("65580");
    message.setTts_speed("120");
    response.setMessage(message);
    return response;
  }
}
Nach dem Login kopieren
SpringContext-Toolklasse definieren


@Component
public class SpringContextUtil implements ApplicationContextAware{

  private ApplicationContext context;

  public ApplicationContext getContext(){
    return context;
  }

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.context = applicationContext;
  }
}
Nach dem Login kopieren
Ereignisverarbeitungsklassenfabrik definieren, um verschiedene Ereignisverarbeitungsobjekte zu erzeugen#🎜🎜 ## 🎜🎜#
@Component
public class EventProcessFactory {

  @Autowired
  SpringContextUtil contextUtil;

  private static Map<CRSEvent, EventProcess> eventProcessMap = new ConcurrentHashMap<>();

  public EventProcessFactory() {
    Map<String, Object> beanMap = contextUtil.getContext().getBeansWithAnnotation(CRSEventAnnotation.class);

    for (Object evetProcess : beanMap.values()) {
      CRSEventAnnotation annotation = evetProcess.getClass().getAnnotation(CRSEventAnnotation.class);
      eventProcessMap.put(annotation.value(), (EventProcess) evetProcess);
    }
  }
  
  public static EventProcess createEventProcess(CRSEvent event){
    return eventProcessMap.get(event);
  }
}
Nach dem Login kopieren

Codeänderung aufrufen

 CRSEvent crsEvent = CRSEvent.valueOf(crsRequest.getEvent());
 EventProcess eventProcess = EventProcessFactory.createEventProcess(crsEvent);
 if (eventProcess != null){
   return eventProcess.execute(crsRequest);
 }
return null;
Nach dem Login kopieren

Auf diese Weise muss der Code nicht umgeschaltet werden, und das Hinzufügen eines Ereignisses ist ebenfalls sehr einfach Implementieren Sie die EventProcess-Schnittstelle.

Das obige ist der detaillierte Inhalt vonSo beseitigen Sie Switch-Case in Springboot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage