Return class 基于枚举输入
Return class based on enum input
我有一个用于游戏服务器的套接字网络 运行。为了简化相互发送数据,我想使用枚举作为构造函数的输入,并使用基于该枚举值的构建方法。
例如,我有一个枚举:
enum DataType {
connectPlayer,
returnServerState;
}
现在我有一个名为 BuildData 的构造函数:
private DataType dataType;
public BuildData(DataType dataType) {
this.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;
}
冒号放在中间,所以我可以对它们使用拆分方法。
我的问题是:我是否必须return一个基于包含正确方法的枚举类型的class实例,还是有更简单的方法来做到这一点?
谢谢!
My question is: do I have to return a class instance based on the enum type which contains the right method, or is there an easier way to do this?
您无法控制构造函数实例化的对象类型。所以你不能在那个时候做出决定。您似乎正在寻找的是一个工厂,它将 return 根据您的数据类型为您提供适当的对象。但是,我认为这对您没有帮助,因为您需要基于类型的不同 build() 方法签名。您需要考虑您没有以完全正确的方式解决问题的可能性。具体来说,您想要的似乎是 "build()" 多态消息。这是一个超出这个问题的答案范围的讨论。
我建议制作一个工厂,它将根据您的枚举值为您提供 class 的实例,就 return 类型而言,[=18= 的所有类型]es 实例,你想 return 声明一个接口,该接口将由你的所有 classes 实现,以便 return 类型将成为该接口。
例如:
Class Factory{
public BaseInterfaceName getInstaceBasedOnEnum(DataType d){
BaseInterfaceName name;
switch(d)
case q:
name = instanceBasedOn D;
break;
}
}
while 其他 classes 的结构,您希望根据数据类型获取其实例
public class xyz implements BaseInterfaceName;
public class abc implements BaseInterfaceName;
我不知道你的体系结构等等,但也许像这样将构建方法放在枚举 class 中会有用吗?
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);
}
如果枚举中的构建方法不是问题 class,那么这似乎是一个非常巧妙的解决方案。
如果您所有的 build
方法只是参数数量不同但具有相同的参数类型和相同的 return 类型,您可以使用接受 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);
}
我有一个用于游戏服务器的套接字网络 运行。为了简化相互发送数据,我想使用枚举作为构造函数的输入,并使用基于该枚举值的构建方法。
例如,我有一个枚举:
enum DataType {
connectPlayer,
returnServerState;
}
现在我有一个名为 BuildData 的构造函数:
private DataType dataType;
public BuildData(DataType dataType) {
this.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;
}
冒号放在中间,所以我可以对它们使用拆分方法。
我的问题是:我是否必须return一个基于包含正确方法的枚举类型的class实例,还是有更简单的方法来做到这一点?
谢谢!
My question is: do I have to return a class instance based on the enum type which contains the right method, or is there an easier way to do this?
您无法控制构造函数实例化的对象类型。所以你不能在那个时候做出决定。您似乎正在寻找的是一个工厂,它将 return 根据您的数据类型为您提供适当的对象。但是,我认为这对您没有帮助,因为您需要基于类型的不同 build() 方法签名。您需要考虑您没有以完全正确的方式解决问题的可能性。具体来说,您想要的似乎是 "build()" 多态消息。这是一个超出这个问题的答案范围的讨论。
我建议制作一个工厂,它将根据您的枚举值为您提供 class 的实例,就 return 类型而言,[=18= 的所有类型]es 实例,你想 return 声明一个接口,该接口将由你的所有 classes 实现,以便 return 类型将成为该接口。
例如:
Class Factory{
public BaseInterfaceName getInstaceBasedOnEnum(DataType d){
BaseInterfaceName name;
switch(d)
case q:
name = instanceBasedOn D;
break;
}
}
while 其他 classes 的结构,您希望根据数据类型获取其实例
public class xyz implements BaseInterfaceName;
public class abc implements BaseInterfaceName;
我不知道你的体系结构等等,但也许像这样将构建方法放在枚举 class 中会有用吗?
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);
}
如果枚举中的构建方法不是问题 class,那么这似乎是一个非常巧妙的解决方案。
如果您所有的 build
方法只是参数数量不同但具有相同的参数类型和相同的 return 类型,您可以使用接受 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);
}