簡體   English   中英

使用枚舉類型重載

[英]Overload using Enum types

是否有幾種枚舉類型:

public enum Parameter {
    XMETRIC, YMETRIC,..

並使用這些類型的方法重載?

method(Parameter.XMETRIC type) {}
method(Parameter.YMETRIC type) {}

我知道您可以使用開關盒並獲得相同的結果,但我發現這是不可能的。

枚舉常量不是類型,它們是引用相應enum類型的實例的變量。 因此,不,您不能將它們用作參數類型。

使用枚舉可以覆蓋每個枚舉常量的方法。 也可以使用帶參數的構造函數。

public enum Parameter {
    XMETRIC() {
        @Override
        public void method() {
        }
    },
    YMETRIC() {
        @Override
        public void method() {
        }
    },
    ...
    ZMETRIC();

    private Parameter() {
    }

    public void method() {
    }
}

在Java 8中,可以使用lambda:

public enum Parameter {
    XMETRIC(() -> { System.out.println(Parameter.this); }),
    YMETRIC(() -> { ... }),
    ...
    ZMETRIC(null);

    private final Runnable method;

    private Parameter(Runnable method) {
        this.method = method;
    }

    public void callMethod() {
        if (method != null) {
            method.run();
        }
    }
}

ENUM本身是類型 ,但是常量不是。

說您有:

enum Roles{
    GUEST,
    USER,
    ADMIN;
}

您可以將Roles作為參數傳遞,例如so- public void someMethod(Roles role)

事例

//Some code
someMethod(Roles.ADMIN);

要明確回答您的問題,那是不可能的。 常量不能表示為數據類型。

首先,java沒有運行時方法重載。 因此,無法基於參數的運行時類在一種方法和另一種方法之間切換。

其次,運行時類型重載基於變量的值不起作用。

簡而言之,不。 你不能有

public void someMethod(1)
public void someMethod(2)  

分別在1或2上觸發。 就像您無法使用枚舉來做到這一點。

Java唯一的重載類型是編譯時。

給出:

public class A {
}
public class B {
}

public void someMethod(A a) { System.out.println("a"); }
public void someMethod(B b) { System.out.println("a"); }

以下調用將產生以下結果:

A a = new A();
A secretB = new B();
B b = new B();

someMethod(a); // prints a
someMethod(secretB); // prints a
someMethod(b); // prints b

someMethod(null); // doesn't compile, you have to cast so A or B
someMethod((B) null); // prints b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM