在 java 中将 class 常量作为参数传递

Pass class constants as parameter in java

我想传递一个class常量作为参数代码是

public class XConstants {
public static final String DATA= "DATA";
public static final String SET = "Node";
}

public static void main(String[] args) {
    foo(XConstants.DATA);
}
public static void foo(XConstants d){
    System.out.println(d);
}

在主要方法中,我将 XConstants.DATA 传递给 foo 函数,但它给我带来了类型未匹配的编译错误,这很明显,因为 XConstants.DATA 是字符串类型。

类似地,如果我使用枚举并将枚举值传递给函数参数,它将完全正常工作。代码是

    enum Color{RED,BLUE}

    public static void main(String[] args) {
        bar(Color.RED);
    }
    public static void bar(Color d){
            System.out.println(d);
    }

此处枚举值只是作为参数传递。 我想知道我应该如何更改我的 XConstants 代码,以便它可以像代码中提到的枚举一样工作(我知道两者是不同的东西)。 请注意,我不想像

这样更改方法签名
public static void main(String[] args) {
        foo(XConstants.DATA);
    }
    public static void foo(String d){
        System.out.println(d);
    }

在这种情况下它会正常工作,因为在这种情况下类型不匹配冲突已解决。 简而言之,我想知道我应该如何更改我的 XContants 代码,我应该使用哪种设计模式来实现这种工作正常,因为它在枚举的情况下工作。

任何帮助将不胜感激

enum Color{RED,BLUE} 类似于

class Color{
    public final static Color RED = new Color("RED");
    public final static Color BLUE = new Color("BLUE");

    private String name;

    private Color(String name){
        this.name = name;
    }        

    public String toString(){
        return name;
    }
    //...rest of code like `values()`, and `ordinal()` methods
}

因此,如果方法需要 Color,则可以传递 Color.RED,因为 RED 它是 Color.

类型的实例

现在,根据您的要求,您可以尝试使 XConstants 适应这种模式。

当您已经知道 enums 完全符合您的目的时,我不确定您为什么要这样做。如果您只是想知道是否可以使用 classes 实现此目的,请继续阅读。

Enums 在许多方面表现得像 classes。我想您已经知道它们也可以有字段、构造函数和方法。但是,目前您感兴趣的最重要的事情是 枚举常量的类型是枚举本身的类型。

因此,要实现这种 enum 之类的行为,您只需以这种方式对 class 进行建模。

public class XConstants {

    private String name;

    public XConstants(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    public static final XConstants DATA = new XConstants("DATA");
    public static final XConstants SET = new XConstants("Node");

    public static void main(String[] args) {
        foo(XConstants.DATA);
        foo(XConstants.SET);
    }

    public static void foo(XConstants d) {
        System.out.println(d);
    }
}

输出:

DATA
Node