亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號