为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕少森 2022-12-15 15:12:53
我有一个具有多个“类型”值的 Java 类,以及一个可以采用其中一种类型的类。我正在尝试使用 Java 的类型系统根据Type枚举更改构造函数的实现,但找不到有关如何执行此操作的任何信息。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) {}}在 Java 中可以实现这种效果吗?例如,就像在 Typescript 中一样。
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

不,你写的不会编译。


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


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

}

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


查看完整回答
反对 回复 2022-12-15
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

看来您要建模的是三种相关类型

  • A,带有字符串值,

  • B,具有浮点值,并且

  • C,带有字符串值。

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

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

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

因此,与此同时,请考虑通常的 Java 解决方法:

  • 子类(叹息)

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

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


查看完整回答
反对 回复 2022-12-15
?
慕容3067478

TA贡献1773条经验 获得超3个赞

看起来 A 和 C 属于同一个“类型”家族,而 B 属于另一个类型。在这种情况下,您应该定义两种类型。如果您希望能够将两种类型视为相同的“系列”,请让它们实现相同的接口:


interface Type {

}


enum Type1 implements Type {

    A,

    C

}


enum Type2 implements Type {

    B

}




public class Action {

    public Action(Type1 type, String value) {}

    public Action(Type2 type, Float value) {}        


查看完整回答
反对 回复 2022-12-15
  • 3 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信