代码之家  ›  专栏  ›  技术社区  ›  rakete

按名称调用变量,编译时不知道该名称

  •  4
  • rakete  · 技术社区  · 16 年前

    如果我想让它灵活一些,可以设置一个变量吗?我认为exmaple更容易理解。

    String hallo1;
    String hallo2;
    
    for(int i = 0; i < 2; i++) {
     hallo & i = Integer.toString(i);
    }
    
    5 回复  |  直到 12 年前
        1
  •  2
  •   Jay    16 年前

      HashMap myData=new HashMap();
      for (int i=0;i<2;++i)
      {
        myData.put("hallo"+i,Integer.toString(i));
      }
    

    稍后,您将使用以下方法将其拉出:

      String whatever=myData.get("hallo1");
    

    当然,您不能直接从映射中访问作为变量的值,您必须始终执行put和get来更新和检索它们,但概念是相同的。

    也就是说,我会非常谨慎地做这件事,因为这使得代码很难维护。如果您需要的名称真的是突然出现的——如果您正在编写泛型代码来读取一个任意的数据库表,该表的名称是由用户在运行时或类似的情况下键入的——很酷。但如果你认为这是一个方便的快捷方式,比如:

      if (region.equals("1"))
        region1Total+=amount;
      else
        region2Total+=amount;
    

    我的简单答案是不要!!如果使用if语句和普通变量,代码更易于维护。然后,任何阅读代码的人都可以查看您的声明,并查看所有可能的变量。您可以进行文本搜索,查找使用它们的任何地方。如果您拼写错误了一个变量名,您将得到一条干净的编译时错误消息,而不是神奇地创建一个新变量。等

      String n=getInputFromScreen();
      String s=getAnotherInputFromScreen();
      hallo & n = s;
    

    您将不知道程序中存在哪些变量,也无法跟踪它们的使用位置。

        2
  •  13
  •   BalusC    16 年前

    不,你不能。幸运的是,世上没有 eval() 在爪哇。

    你最好的办法是抓住一个 Array ArrayList

    String[] hallos = new String[2];
    
    for (int i = 0; i < 2; i++) {
        hallos[i] = Integer.toString(i);
    }
    
        3
  •  4
  •   Eli Acherkan    16 年前

    这在技术上是可行的 reflection 真正地 有充分的理由这么做。这将使您的代码更难调试和阅读。

    编辑:
    正如评论所强调的那样:

    1. 为了澄清,我强烈建议 不 被诱惑使用反射。其他答案指出了实现目标的更好方法,例如数组。
        4
  •  0
  •   mohdajami    16 年前

    可以使用字符串数组。
    比如:

     String[] hallos = new String[10];
    
     //when looping you can use regular (counter) loop or for each loop
     for (String s: hallos){
           //do whatever you want with each String
     }
    
        5
  •  0
  •   froadie    16 年前

    不,这样做的方法是使用数组、列表或类似的东西。更直观的做法是将它们组合在一起,然后让许多变量(实际上应该是相关的)浮动在一起。没有办法做到这一点——至少在Java中是这样。我在脚本语言中看到过这种情况,但那完全是另一回事。。。