【问题标题】:How to validate a String is in enumerated annotations or not如何验证字符串是否在枚举注释中
【发布时间】:2017-04-27 00:49:43
【问题描述】:

我在 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;
    }
}

我认为现在这对我来说太糟糕了,而且我认为“还有其他解决方案可以解决我的问题”。

感谢您的支持。

【问题讨论】:

  • 这里没有枚举,只有字符串常量 你应该使用适当的枚举。
  • 这是 Google 减少枚举大小的最佳做法。因此我对此感到困惑。

标签: java android annotations


【解决方案1】:

由于您主要只是将现有值重新分配给新变量,因此您可以这样做:

public MessageCall(String message) {

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

虽然也许更好的方法是创建一个包含您的StringsList,然后检查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");
}

【讨论】:

  • 这是一个很好的解决方案,但对我来说不是。枚举的注释是谷歌减少枚举大小的最佳实践,但我可以做类似MessageCall.Type.constant(String) 的事情。让我们想象一下,当这个列表中的类型有 40 个不同的 String 时。我想我的源代码会变得很糟糕。
猜你喜欢
  • 1970-01-01
  • 2018-10-13
  • 2020-11-29
  • 2011-09-11
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
相关资源
最近更新 更多