Java函数签名接受单个枚举值

Ben*_*ick 5 java

我有一个带有多个“类型”值的Java类,以及一个可以采用这些类型之一的类。

我试图根据Type使用Java的类型系统的枚举来更改构造函数的实现,但找不到有关如何执行此操作的任何信息。

public enum Type {
    A,
    B,
    C
}

public class Action {
    public Action(Type.A type, String value) {}
    public Action(Type.B type, Float value) {}
    public Action(Type.C type, String value) {}
}
Run Code Online (Sandbox Code Playgroud)

在Java中可以达到这种效果吗?就像在打字稿中一样。

900*_*000 13

不,您编写的内容无法编译。

您可以使用命名工厂方法+私有构造函数来实现类似的结果:

public class Action {
  private Action(Type discriminator, String s, Float f) {...}
  public static ofA(String value) { return new Action(Type.A, value, null); }
  public static ofB(Float value)  { return new Action(Type.B, null, value); }
  public static ofC(String value) { return new Action(Type.C, value, null); }
}
Run Code Online (Sandbox Code Playgroud)

构造函数可能会具有多个if / else分支。(抱歉,Java中尚不提供代数类型和模式匹配。)


Ray*_*oal 4

看来您正在尝试建模的是三种相关类型

  • A,具有字符串值,
  • B,具有浮点值,并且
  • C,带有字符串值。

如果是这样,Java 非常希望您创建抽象基类的三个子类,A、B 和 C,因为 Java 并不真正执行不相交和类型(又名不相交联合类型、标记联合类型)。出色地。

有关如何使用“标签”(这是名称标记联合或标记总和的名称的来源)的单一类型的信息,请在此 Stack Overflow 问题中讨论。最好在某个时候检查一下这个问题,因为提供了很多想法;大多数使用泛型。

恕我直言,Java 从来没有真正找到一种正确的方法来处理求和类型。Java 8 引入了可选值,但“仅可选值”,因此正确的求和类型需要一些工作。

因此,同时考虑一下常见的 Java 解决方法:

  • 子类(叹气)
  • 静态工厂方法(因为您不能使用枚举重载构造函数:A、B 和 C 都属于同一类型)。

编辑:请参阅 @9000 的精彩答案,它准确地展示了如何实现静态工厂方法。