有一个存储类是这样的:
public class CommandsIntentions {
static Command ADMIN_CHANNELS_CREATE = new Command(new String[]{"ADMIN", "CHANNELS", "CREATE"}, DataCommands.ChannelCreate.class);
static Command ADMIN_CHANNELS_USERS_JOIN = new Command(new String[]{"ADMIN", "CHANNELS", "USERS", "JOIN"}, DataCommands.ChannelUsersJoin.class);
static Command ADMIN_CHANNELS_USERS_APPEND = null; // TODO
static Command USER_CHANNELS_MESSAGES_POST_NEW = new Command(new String[]{"USER", "CHANNELS", "MESSAGES", "POST", "NEW"}, DataCommands.ChannelMessagesPostNew.class);
}
存储外壳是:
public class Command {
String[] intents;
Class pattern;
public Command (String[] intents, Class pattern) {
this.intents = intents;
this.pattern = pattern;
}
}
这是我的呼吁:
@Override
public void onMessage (WebSocket webSocket, String message) {
Helper.MessagePacket packet = Helper.parsePacket(message);
switch (packet.intention) {
case CommandsIntentions.ADMIN_CHANNELS_CREATE.intents -> {
break;
}
default -> {
return;
}
}
}
但会抛出错误:
Constant expression required: 42
我还附上了包的解析:
public static class MessagePacket {
final String hash;
final String[] intention;
final String preData;
Object postData;
public MessagePacket (String[] intention, String controlSum, String data) {
this.intention = intention;
this.hash = controlSum;
this.preData = data;
}
public void parseData (Class pattern) {
postData = JsonIterator.deserialize(preData, pattern);
}
}
@Contract("_ -> new")
public static @NotNull MessagePacket parsePacket (@NotNull String packet) {
String[] splitPacket = packet.split("%");
return new MessagePacket(splitPacket[0].split("-"), splitPacket[1], splitPacket[2]);
}

如果你真的想使用
switch,那么你可以将类重写Command为枚举 (enum) ,其中包含必要的字段和从意图数组中获取实例的方法,因为根据定义,枚举中的值是常量:因此,调用这样的命令可能如下所示:
我想注意
break经典运算符中使用的内容switch(case后面使用冒号),以便代码不会“穿过”“cases”中的不同标签。当使用“新”语法
switch- 表达式(在 后面带有箭头case)时break,在这种情况下不需要运算符(没有可以提前退出的循环)。