【问题标题】:Java: Setting a variable to a variable of a class, where the name of the class is a string?Java:将变量设置为类的变量,其中类的名称是字符串?
【发布时间】:2011-10-20 00:33:15
【问题描述】:

这是我今天的第三个(希望是最后一个)问题。

是否可以将变量的值声明为类的变量,其中类的名称是字符串?

例子

int newalpha;
String color_name = "yellow";
Color red = new Color();
Color yellow = new Color();
Color blue = new Color();
newalpha = color_name.alpha

在本例中,“.alpha”是包含在 Color 类中的变量。我要模拟的部分是“newalpha = color_name.alpha”,因为显然“color_name”是一个字符串,而不是颜色。这可能吗?

谢谢

【问题讨论】:

    标签: java string class variables


    【解决方案1】:

    TL;DR 回答:没有。

    现实:是的,有点像,通过反射和ew。

    根据您的用例,可能有一种方法可以实现您想要的效果,例如将颜色存储在哈希图中,并以颜色名称作为键,因此您只需说 colors.get(colorName).alpha

    Map<String, Color> colors = new HashMap<String, Color>() {{
        put("red", new Color());
        put("yellow", new Color());
        put("blue", new Color());
    }};
    String colorName = "yellow";
    int newalpha = colors.get(colorName).alpha;
    

    【讨论】:

    • 实际上是不可能——甚至没有“某种”——在这种情况下,因为它们是局部变量而不是类成员;-) 无论如何,请考虑扩展示例(使用 HashMap 或其他)。
    • 类型参数的错字:Map --> Map ;)
    【解决方案2】:

    正如在其他地方发布的那样,您的确切问题的答案是“不”。还有我的补充:“使用更具表现力的语言,例如 Lisp、Python、Ruby 或类似的语言。”

    我怀疑你问错了问题。您真正想要的是一种获取任意颜色的 alpha 值的方法。面向对象的设计倡导者会以此为契机,让您的大脑充满工厂方法、子类型多态性、枚举类型和其他类似的东西。

    鉴于我对您的编码水平和项目复杂性的完全未受过教育的猜测,看起来可以接受的解决方法(如果不是正确的方法)要简单得多:

    int newAlpha = 0;
    if(colorName.equals("yellow") newAlpha = yellow.getAlpha();
    else if(colorName.equals("red") newAlpha = red.getAlpha();
    else if(colorName.equals("blue") newAlpha = blue.getAlpha();
    else //raise some kind of exception, assert false, or do something else that seems sensible
    

    (请注意,我稍微更改了一些名称以匹配 Java 的风格。)

    我不知道 Color 类中发生了什么(甚至不知道 redyellowblue 有何不同——使用当前代码,它们将是相同的东西(局部变量名称不会影响它们引用的对象)),但将 if 序列分解为单独的方法可能是合适的。和/或因此使用HashMap

    HashMap<String, Integer> alphaValues = new HashMap<String, Integer>();
    alphaValues.put("red", /* something like red.getAlpha() */);
    //etc.
    // ...
    newAlpha = alphaValues.get(colorName);
    

    我还没有真正解决范围问题——我相信你能弄清楚。

    希望有帮助!

    编辑:Dave Newton 在 hashmap 方面击败了我——他在我创建我的帖子时编辑了他的帖子。

    【讨论】:

    • 这在大多数“表达性”语言中也不会受到喜爱。对于一般意义上的地图适当的结构 - 一些语言只是更好地支持成语(或一个好的“案例表达”)。
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 2011-10-31
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多