【发布时间】:2014-05-22 13:42:21
【问题描述】:
我已经编写了使用我在 websockets 之上为创建 Android 应用程序的项目设计的协议的代码。
我有一个使用 Autobahn 库 weCommunicationManager 处理 websocket 通信的类。
我有许多变量和标签,用于处理从我的服务器通过 websockets 到应用程序的接收到的 JSON 消息。
为了将事物分开并放在一个地方,我创建了一个抽象类ExICSProtocol,它将标签作为公共静态成员保存,以便可以在任何需要的地方引用它们。
在接收到的消息中是消息类型的整数值,我需要能够打开它来定义如何处理接收到的特定消息。
为此,我在 ExICSProtocol 类中实现了一个公共枚举,如下所示,
public static enum MESSAGE_TYPE{
PROTOCOL_HANDSHAKE(0),
USER_CONNECTED(1),
USER_DISCONNECTED(2),
SYSTEM_STATE(3),
CHANGE_ROOM(4),
EXAM_START(5),
EXAM_PAUSE(6),
EXAM_STOP(7),
EXAM_XTIME(8),
SEND_MESSAGE(9),
SUCCESS(69),
FAILURE(-1),
TERMINATE_CONNECTION(-2);
private int code;
MESSAGE_TYPE(int code){
this.code = code;
}
public int getCode(){
return this.code;
}
}
我正在尝试在 wsCommunicationManager 代码中使用它,如下所示,
private static void handleMessage(String message){
try{
JSONObject messageObject = new JSONObject(message);
JSONObject messageHeader = messageObject.getJSONObject(ExICSProtocol.TAG_HEADER);
JSONObject messagePayload = messageObject.getJSONObject(ExICSProtocol.TAG_PAYLOAD);
int messageType = messageHeader.getInt(ExICSProtocol.TAG_MESSAGE_TYPE);
switch(messageType){
case ExICSProtocol.MESSAGE_TYPE.PROTOCOL_HANDSHAKE.getCode():
//DO SOMETHING HERE
break;
...
default:
throw new ExICSException("Unknown Message Type Received");
break;
}
}catch (JSONException e){
Log.e(TAG, "Failed to parse received message " + message, e);
}catch (ExICSException e){
Log.e(TAG, "Excaption Handling Message Occurred", e);
}
}
我在ExICSProtocol.MESSAGE_TYPE.PROTOCOL_HANDSHAKE.getCode(): 下收到错误标记,说需要一个常量表达式。然而,这应该是不变的吗?
我尝试了一些不同的方法,将枚举移动到使用它的类;同样的问题。使 enum 持有的私有 int 公开,以便可以直接访问;同样的问题。
我见过很多在 switch 语句中使用枚举的例子,但和我不太一样。我是否在声明或初始化中遗漏了某些内容,或者我正在尝试做一些不起作用的事情。
我知道有一些相对简单的解决方法,例如将数字类型代码定义为公共静态最终整数,但如果可能的话,我希望将类型代码放在 MESSAGE_TYPE 下。
【问题讨论】:
-
不是常量,是方法调用...
-
我还尝试将 int“代码”本身公开并直接访问它,删除方法调用,但这会产生相同的错误,正如我在问题中所说的那样,例如
ExICSProtocol.MESSAGE_TYPE.PROTOCOL_HANDSHAKE.code -
嗯,它仍然不是一个常数;这是一个字段访问。只有枚举值是(事实上,它们是类,在运行时与它们的封闭类同时加载)。
-
请记住,不鼓励在 Android 平台上使用枚举。
标签: java android enums switch-statement