返回基于枚举输入的类

时间:2015-05-06 18:44:09

标签: java class input constructor enums

我有一个为游戏服务器运行的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;
}

冒号放在中间,所以我可以对它们使用拆分方法。

我的问题是:我是否必须根据包含正确方法的枚举类型返回类实例,或者是否有更简单的方法来执行此操作?

谢谢!

4 个答案:

答案 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);
}

如果在枚举类中使用构建方法不是问题,那么它似乎是一个非常简洁的解决方案。