string.startWith z użyciem enum do switch case

0

Hej!

Czy jest sposób aby w switch case użyć metody startWith gdzie startWith zawiera zmienną określoną w enum?

oto kod:

enum:

public enum ChatProtocol {
    POST_COMMAND,
    NICKLIST_COMMAND,
    LOGIN_COMMAND
}

jak to robie z if'ami:

while( started ) {
                    line = in.readLine();


                    if (line.startsWith(ChatProtocol.LOGIN_COMMAND.toString())) {
                        out.println(ChatProtocol.LOGIN_COMMAND);
                    }

          .
          .
          .
}

Kwestia jest taka że w enum mam okolo 30 podobnych zmiennych i użycie switch case może wpłynąc pozytywnie nan optymalizacje.
Sugerowany na stacku substring raczej nie wchodzi w grę ponieważ długości nazwy zminnych są różne.

1

Nie ma takiego sposobu, ponieważ wynik funkcji startWith nie jest znany przed momentem uruchomieniem, tym samym nie można użyć go w switch.

Tak czy siak skończyłbyś z trzydziestokrotnym powieleniem kodu - co za różnica, czy w formie łańcucha ifów, czy switch-case'ów.

Moim zdaniem powinieneś odwrócić implementację i iterować po wartościach enuma:

line = in.readLine();
for (ChatProtocol value : ChatProtocol.values()) {
    if (line.startsWith(value.toString()) {
        out.println(value);
        break; // ewentualnie
    }
}

I wszystko. Na dodatek kod taki jest odporny na wszelkie zmiany w enumie.

0

Rozwiązałem problem w inny sposób, za każdym przesłaniem komendy enum dodaję na jej końcu znak ';' po czym oddzielam splitem tą komendę od reszty wiadomości i w zależności od tego wrzucam ją do switcha. Jakby się komuś przydało:

 Protocol command = Protocol.valueOf(line.split(";")[0]);

                    switch (command){
                        case LOGIN_COMMAND:
                            break;
                        case NICK_COMMAND:

                            break;

Temat zamknięty, pozdrawiam ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1