我有一个为游戏服务器运行的Socket网络。为了简化彼此之间的数据发送,我想使用枚举作为构造函数的输入,并使用基于该枚举值的构建方法。
例如,我有一个枚举:
enum DataType {
connectPlayer,
returnServerState;
}
现在我有一个名为BuildData的构造函数:
private DataType dataType;
public BuildData(DataType dataType) {
this.dataType = dataType;
}
我的问题是:我希望能够使用基于DataType的不同输入的构建方法。
例如,如果我有DataType' connectPlayer',我想要一个带有以下输入的构建方法:
public String build(String UUID, String server) {
return "connectPlayer:" + UUID + ":" + server;
}
但是,当DataType是returnServerState时,我希望它是这样的:
public String build(String thisServer, String serverState) {
return "setServerState:" + thisServer + ":" + serverState;
}
冒号放在中间,所以我可以对它们使用拆分方法。
我的问题是:我是否必须根据包含正确方法的枚举类型返回类实例,或者是否有更简单的方法来执行此操作?
谢谢!
答案 0 :(得分:1)
如果所有build
方法的参数数量不同但参数类型相同且返回类型相同,则可以使用接受varargs的方法,如下所示:
String build(String... args)
此外,您应该查看enum API,因为java枚举不仅可以枚举值。
您可以按如下方式扩展枚举:
enum DataType {
connectPlayer {
@Override
public String build(String... args) {
if (args.length != 2) throw new IllegalArgumentException("wrong number of arguments");
String UUID = args[0];
String server = args[1];
return "connectPlayer:" + UUID + ":" + server;
}
},
returnServerState {
@Override
public String build(String... args) {
// do something else here...
return "returnServierStateArgs " + Arrays.toString(args);
}
};
public abstract String build(String... args);
}
用法:
System.out.println(DataType.connectPlayer.build("first", "second"));
System.out.println(DataType.returnServerState.build("first", "second", "...", "more"));
// prints:
// connectPlayer:first:second
// returnServierStateArgs [first, second, ..., more]
或者,您可以创建interface
并为不同的DataType
实现它。
interface Builder {
String build(String... args);
}
答案 1 :(得分:0)
我的问题是:我是否必须根据包含正确方法的枚举类型返回类实例,或者是否有更简单的方法来执行此操作?
您无法控制构造函数实例化的对象类型。所以你不能在那时作出决定。您似乎正在寻找的工厂将根据您的DataType返回适当的对象。但是,我认为这对您没有帮助,因为您需要基于类型的不同build()方法签名。你需要考虑你没有以正确的方式解决问题的可能性。具体来说,看起来你想要的是以多态方式“构建()”一条消息。这是一个超出这个问题答案范围的讨论。
答案 2 :(得分:0)
我建议创建一个Factory,根据你的枚举值给你一个类的实例,就返回类型而言,你要返回的所有类实例都声明了一个接口,它将由所有类,以便返回类型将是该接口。
例如:
Class Factory{
public BaseInterfaceName getInstaceBasedOnEnum(DataType d){
BaseInterfaceName name;
switch(d)
case q:
name = instanceBasedOn D;
break;
}
}
而您希望根据数据类型获取实例的其他类的结构
public class xyz implements BaseInterfaceName;
public class abc implements BaseInterfaceName;
答案 3 :(得分:0)
我不知道你的架构等等,但也许将build方法放在enum类中是有用的吗?
public enum DataType {
CONNECTPLAYER{
@Override
public String build(String... strings) {
return "connectPlayer:" + strings[0] + ":" + strings[1];
}
},
RETURNSERVERSTATE{
@Override
public String build(String... strings) {
return "setServerState:" + strings[0] + ":" + strings[1];
}
};
public abstract String build(String...strings);
}
如果在枚举类中使用构建方法不是问题,那么它似乎是一个非常简洁的解决方案。