2017-04-27 38 views
0

我在Java中的Enum,我把它變成enumerated annotations這樣的:如何驗證字符串是枚舉的註解或不

public static final String PING = "ping"; 
public static final String PING_BACK = "ping.back"; 
public static final String REQUEST_MODE_NORMAL = "request_mode_normal"; 
public static final String ERROR_MESSAGE = "error_message"; 

@StringDef({PING, PING_BACK, REQUEST_MODE_NORMAL, ERROR_MESSAGE}) 
@Retention(RetentionPolicy.SOURCE) 
public @interface Type { 
} 

@MessageCall.Type 
private String mMessage; 

現在我有另一個String值是由用戶輸入的,我想將此傳遞到mMesssage字段。這是在編譯時未知的值,所以我要檢查這個類似:

public MessageCall(String message) { 
    switch (message) { 
     case PING: 
      mMessage = PING; 
      break; 
     case PING_BACK: 
      mMessage = PING_BACK; 
      break; 
     case REQUEST_MODE_NORMAL: 
      mMessage = REQUEST_MODE_NORMAL; 
      break; 
     default: 
      mMessage = ERROR_MESSAGE; 
    } 
} 

我認爲這是如此糟糕的解決方案,我現在和我wounder說:「有什麼其他的解決方案來解決我的問題。」

感謝您的支持。

+0

這裏沒有枚舉,只是字符串常量您應該使用適當的枚舉。 – shmosel

+0

這是Google減少枚舉大小的最佳做法。所以我混淆了這一點。 –

回答

2

正如你主要是剛剛重新分配現有的值到一個新的變量,你可以不喜歡它:

public MessageCall(String message) { 

    if (message.equals(PING) || 
     message.equals(PING_BACK) || 
     message.equals(REQUEST_MODE_NORMAL)) 
    { 
     mMessage = message; 
    } 
    else { 
     mMessage = ERROR_MESSAGE; 
    } 
} 

雖然也許有更好的方式可能是建立一個List包含您Strings然後檢查查看List是否包含該消息。

List<String> messages = Arrays.asList("ping", "ping_back"); 
if (messages.contains("ping")) { 
    System.out.println("message is ping"); 
} 
if (!messages.contains("test")) { 
    System.out.println("no message for test"); 
} 
+1

@ ousmane-mahy-diaw感謝編輯 –

+0

忘記取出額外的'}',但現在完成^^。 –

+0

這是一個很好的解決方案,但對我來說不是這樣。枚舉的註釋是谷歌減少枚舉大小的最佳做法,但我可以像這樣做'MessageCall.Type.constant(String)'。讓我們想象一下,當這個類型有40個不同的字符串時,我認爲我的源代碼會變得很糟糕。 –