【问题标题】:Assigning variables inside the loop在循环内分配变量
【发布时间】:2016-01-28 17:29:50
【问题描述】:

以下代码导致“避免在循环中声明或分配不依赖于循环条件的变量”。 (根据编码最佳实践)

 private void testingLoop() {
    String var[]= {"java", "code", "review"};
    String arr[] = new String[1];
    for(String i : var)
    {
    arr[0] = i.concat("Script");
    }  
    System.out.println("The result is: " +arr[0]);
}

为什么当我们在循环中分配变量时它被认为是一种不好的做法?有什么办法可以解决这个问题?

注意:我的目的只是为了展示 for 循环,所以不要过多考虑代码的用途。

【问题讨论】:

  • 有时您可能会想在 cmets 中争论,然后您会记得在 cmets 中没有人改变过任何人的想法。然后你开始骂人,因为你已经没有什么好争论的了。然后你会意识到,这些话都是短暂的,并不存在于物理上。然后你意识到你的整个工作包括移动非物理位。然后你会意识到有一个完整的家庭手工业围绕解决现实世界中不存在的问题而建立。然后你很难过。不要难过。不要争论。

标签: java for-loop


【解决方案1】:

请注意,局部变量的范围应始终尽可能小。

从维护的角度来看,在循环中声明或分配变量比其他方法要好。在尽可能窄的范围内,在同一个地方声明和初始化变量。不要在声明和初始化之间留下空隙,也不要污染你不需要的命名空间。

更多参考: Declaring variables inside or outside of a loop

【讨论】:

  • 我已经经历过了,我明白为什么在循环外声明变量更好的原因,但我在这里分配。
  • “但我在这里指派”是什么意思?
  • @HookUp 我明白为什么在循环外声明变量更好的原因:这个答案与你所理解的完全相反,它是正确的。在循环中声明变量会更好,因为变量的作用域更小:这使得代码更容易重构,并且留出更少的错误空间。
  • @JBNizet:是的,你是对的!但我认为这取决于您是在循环外还是在循环内使用变量。
【解决方案2】:

我自己也不太确定,但我可以尝试一下。

您的代码当前正在替换 arr 数组的值。所以第一次循环存储javaScript,第二次存储codeScript,最后一次存储reviewScript。我唯一的问题是,当你在最后打印它时,它每次只会打印reviewScript,因为这是你为每个循环获得的最后一个字符串值。

这也很容易:

private void testingLoop() {
    String var[]= {"java", "code", "review"};

    // No need for this anymore

    // String arr[] = new String[1];
    // for(String i : var)
    // {
    //     arr[0] = i.concat("Script");
    // }  
    // System.out.println("The result is: " +arr[0]);

    int lastIndex = var.length;
    System.out.println("The result is: " + var[lastIndex - 1] + "Script");
}

所以我认为它给出消息的原因是因为你没有理由在 for 循环中分配任何东西;只是为了得到你var数组中的最后一个元素。您可以在 AFTER 末尾找到concat,找出var 中最后一个元素的索引(尽管这可以通过var.length 完成,就像我之前提到的那样)。

【讨论】:

    【解决方案3】:

    我想这个警告的意思是,如果你可以在循环外声明/分配变量并得到相同的结果——那么最好做 1 次而不是 N 次。

    private void testingLoop() {
        String var[]= {"java", "code", "review"};
        String arr[] = new String[1];
        for(String i : var)
        {
        arr[0] = i.concat("Script");
        }  
        System.out.println("The result is: " +arr[0]);
    }
    

    一样
    private void testingLoop() {
        String var[]= {"java", "code", "review"};
        String arr[] = new String[1];
        arr[0] = var[var.length - 1].concat("Script");
        System.out.println("The result is: " +arr[0]);
    }
    

    【讨论】:

    • 这行得通!感谢大家的宝贵意见。
    【解决方案4】:

    试试:

    private void testingLoop() {
        String var[]= {"java", "code", "review"};
        List<String> arr = new ArrayList<String>();
        for(String i : var)
        {
            arr.add(i.concat("Script"));
        }  
        System.out.println("The result is: " +arr[2]);
    }
    

    【讨论】:

    • 我不想将其更改为 List,因为稍后在我的代码中,我将其发送到需要字符串的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多