string.startWith z użyciem enum do switch case

string.startWith z użyciem enum do switch case
G9
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:39
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:

Kopiuj
public enum ChatProtocol {
    POST_COMMAND,
    NICKLIST_COMMAND,
    LOGIN_COMMAND
}

jak to robie z if'ami:

Kopiuj
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.

V-2
  • Rejestracja:około 8 lat
  • Ostatnio:10 miesięcy
  • Postów:671
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:

Kopiuj
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.


Nie ma najmniejszego powodu, aby w CV pisać "email" przed swoim adresem mailowym, "imię i nazwisko" przed imieniem i nazwiskiem, ani "zdjęcie mojej głowy od przedniej strony" obok ewentualnego zdjęcia. W drugiej firmie której już pracuję mam palących marihuanę programistów [...] piszą kod "leniwie", często nie wysilając się, rozwlekając ten kod, unikając np. programowania funkcyjnego (mówię tutaj o lambdach w javie).
edytowany 2x, ostatnio: V-2
G9
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:39
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:

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

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

                            break;

Temat zamknięty, pozdrawiam ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.