【问题标题】:Pass class constants as parameter in java在java中将类常量作为参数传递
【发布时间】:2015-07-10 19:02:18
【问题描述】:

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

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 代码,r 我应该使用哪种设计模式来实现这个工作正常,因为它在枚举的情况下工作。

任何帮助将不胜感激

【问题讨论】:

  • 我很困惑。为什么要将String 对象传递给以XConstants 对象作为参数的方法?简单地说“我不想更改方法签名”是不够的。您需要解释为什么,以便我们可以帮助您实现您想要实现的目标。
  • 由于 XConstants 不是枚举(并且 DATA 不是枚举类型),因此您不能按原样对待它们...
  • @RedRoboHood 仅用于学习目的,我想将 String 更改为 XConstants Object 以了解它在枚举情况下的工作方式
  • @ericbn 我知道你在评论中提到了什么,我只是想知道我应该如何实现这个目标??
  • @Mark 请记住,String 类和 XConstants 类完全不相关。它们都直接继承自 Object 在单独的分支中。为了从String 转换为XConstants,您需要创建自己的函数,该函数从String 构造XConstants。没有内置的 Java 方法可以做到这一点,据我所知,这里没有任何意义。

标签: java enums parameter-passing constants


【解决方案1】:

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 适应这种模式。

【讨论】:

  • @RedRoboHood 谢谢,我不知道我怎么错过了构造函数部分,它早在我的代码中(一定是复制粘贴错误)。
  • 谢谢@Pshemo,干得好,这是我想知道的。你在某种程度上让我明白了
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢@Ravi Thapliyal,你的回答让我明白了。我知道枚举完全适合我的问题,但这是出于学习目的谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多