Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按名称调用变量,这不是';编译时不知道_Java_Variables - Fatal编程技术网

Java 按名称调用变量,这不是';编译时不知道

Java 按名称调用变量,这不是';编译时不知道,java,variables,Java,Variables,如果我想让它灵活一些,可以设置一个变量吗?我认为exmaple更容易理解 String hallo1; String hallo2; for(int i = 0; i < 2; i++) { hallo & i = Integer.toString(i); } 字符串hallo1; 弦hallo2; 对于(int i=0;i

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

String hallo1;
String hallo2;

for(int i = 0; i < 2; i++) {
 hallo & i = Integer.toString(i);
}
字符串hallo1;
弦hallo2;
对于(int i=0;i<2;i++){
hallo&i=整数。toString(i);
}
不,您不能。幸运的是,Java中没有
eval()
这样的东西

你最好的办法是抓住一个或一个。下面是一个数组示例:

String[] hallos = new String[2];

for (int i = 0; i < 2; i++) {
    hallos[i] = Integer.toString(i);
}
String[]hallos=新字符串[2];
对于(int i=0;i<2;i++){
hallos[i]=Integer.toString(i);
}

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

从技术上讲,这是可能的,但我建议不要这样做,除非你有很好的理由这么做。这将使您的代码更难调试和阅读

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

  • 为了澄清,我强烈建议不要尝试使用反射。其他答案指出了实现目标的更好方法,例如数组
  • 反射对局部变量没有帮助
    如果确实需要在编译时使用未知名称的变量,可以通过创建包含任意名称和值的结构来实现这一效果。比如,您可以创建一个HashMap,其中键是名称。然后,您上面的示例类似于:

      HashMap myData=new HashMap();
      for (int i=0;i<2;++i)
      {
        myData.put("hallo"+i,Integer.toString(i));
      }
    
      if (region.equals("1"))
        region1Total+=amount;
      else
        region2Total+=amount;
    
     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
     }
    
    等等

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

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

      HashMap myData=new HashMap();
      for (int i=0;i<2;++i)
      {
        myData.put("hallo"+i,Integer.toString(i));
      }
    
      if (region.equals("1"))
        region1Total+=amount;
      else
        region2Total+=amount;
    
     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
     }
    
    我的简单答案是不要!!如果使用if语句和普通变量,代码更易于维护。然后,任何阅读代码的人都可以查看您的声明,并查看所有可能的变量。您可以进行文本搜索,查找使用它们的任何地方。如果您拼写错误了一个变量名,您将得到一条干净的编译时错误消息,而不是神奇地创建一个新变量。等等

    另一方面,如果你能写下

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

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

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

      HashMap myData=new HashMap();
      for (int i=0;i<2;++i)
      {
        myData.put("hallo"+i,Integer.toString(i));
      }
    
      if (region.equals("1"))
        region1Total+=amount;
      else
        region2Total+=amount;
    
     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
     }
    

    很抱歉,这个示例没有使它变得更清晰。这是初学者的常见要求。通常正确的解决方案是使用数组、列表、集合或映射。我不想使用字符串数组。字符串只是一个示例。我有一个GridLayout(3,3),每个字段都有一个GridLayout(3,3)。现在我想制作81个标签,比如:field_A1_A1,field_A1_A2。。。等也许你现在明白我的问题了。在这种情况下,你可以使用
    for
    循环:
    for(int x=0;x<3;x++){for(int y=0;y<3;y++){String currentName=“field_A”+x+“\u A”+y;currentGridLayout.addLayoutComponent(currentName,new Label(currentName));}
    将创建一个带有9个
    标签的3x3网格,你也可以用同样的原则来处理外部3x3网格。我不知道为什么Eli在这个问题上被否决了。当然,你不能用局部变量。但是,从这个问题上看,使用局部变量是一项要求,这一点一点也不清楚。像Eli一样,我建议在使用反射时要非常谨慎,因为反射会使代码更难阅读和维护。但这是可以做到的。无局部变量限制只是其中一个缺点。在我看来,这个建议的问题是,像这样的问题通常会被问到,因为有人不知道数组/集合,并且试图做一些他们非常适合的事情。在这种情况下,建议反思只会让他们走上一条漫长而危险的道路,而这条路不会通向任何地方。@Joachim:我完全同意你的观点,这就是我建议不要反思的原因。+1表示“幸运”。脚本语言中的这种情况使得它们很难维护。无法判断变量的使用位置。在这里显示foreach循环时要小心,因为问题是设置变量并分配给
    s
    不会对该代码产生预期效果(即,它不会改变
    hallos
    )。我知道,这就是为什么我没有为循环设置相同的主体。只是教OP如何使用每个循环。@Joachim Sauer-谢谢,我刚刚意识到我的措辞听起来有局限性。我会改变的。