java 避免重新分配参数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13507025/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 13:01:31  来源:igfitidea点击:

Avoid reassigning parameters

javapmd

提问by someone

I'm getting PMD red colored violation

我收到 PMD 红色违规

Avoid reassigning parameters such as 'bankRequest'

避免重新分配诸如“bankRequest”之类的参数

This is my method

这是我的方法

   @Override
public BankDTO loadTariff(BankDTO bankRequest, int[] executionLevels) {
    double[] fee = null;
    for (int level : executionLevels) {

        // Check the tariff availability from execution level one to .....
        fee = loadCokaAndBankFee(bankRequest,level);

        if (fee != null) { // if fee found reload the bank request with new
                            // amount
            bankRequest = reloadBankRequest(bankRequest, fee);
            break; // no need to go for any other level deep level cover //
                    // here.
        } // if tariff not found use the esb provided amounts
    }

    return bankRequest;
}

Could someone explain what wrong with this code. If I ignore it what is the impact.

有人可以解释一下这段代码有什么问题。如果我忽略它有什么影响。

回答by Isaac

In your case, there's a parameter named bankRequest. Inside the method, you are assigning bankRequesta value.

在您的情况下,有一个名为bankRequest. 在方法内部,您正在分配bankRequest一个值。

By some, it is considered an ill approach to assign values to parameters within a method's body, as it is, at times, confusing. Some developers prefer always assuming that a parameter is never assigned any value during a method's run.

有些人认为在方法主体内为参数赋值是一种糟糕的方法,因为它有时会令人困惑。一些开发人员更喜欢始终假设在方法运行期间从不为参数分配任何值。

To avoid that, you can declare an alternative variable of type BankDTO:

为避免这种情况,您可以声明一个类型为的替代变量BankDTO

BankDTO updatedRequest = bankRequest;
...
...
updatedRequest = reloadBankRequest(bankRequest, fee);
...
...
return updatedRequest;

回答by sorencito

You should avoid re assigning variables for the reasons already given. Anyway,instead of assigning a new variable consider just returning from the loop when finding the correct value. Thiswould also make "break" redundant.

由于已经给出的原因,您应该避免重新分配变量。无论如何,与其分配新变量,不如考虑在找到正确值时从循环中返回。这也会使“中断”变得多余。

回答by Swagatika

Reassigning values to incoming parameters is not recommended. Use temporary local variables instead.

不建议为传入参数重新分配值。改用临时局部变量。

Example(s): 

public class Foo {
  private void foo(String bar) {
    bar = "something else";
  }
}

reference: http://pmd.sourceforge.net/pmd-5.0.1/rules/java/design.html

参考:http: //pmd.sourceforge.net/pmd-5.0.1/rules/java/design.html

回答by semTex

In java parameters are called by reference. In your case this means, if you change the object bankRequestit is not visible outside of the method loadTariff.

在java中参数是通过引用调用的。在您的情况下,这意味着,如果您更改对象,bankRequest它在方法之外是不可见的loadTariff

After the line bankRequest = reloadBankRequest(bankRequest, fee);the variable bankRequest points to a different object of BankDTO.

在该行之后bankRequest = reloadBankRequest(bankRequest, fee);,变量 bankRequest 指向一个不同的 BankDTO 对象。

If you want to change internal values of bankRequest and use it after calling loadTariffyou should do something like bankRequest.loadRokaAndBankFee(fee).

如果您想更改 bankRequest 的内部值并在调用后使用它,loadTariff您应该执行类似bankRequest.loadRokaAndBankFee(fee).

回答by user7839057

Reassigning values to the incoming parameters is not recommended. Use temporary local variable.

不建议为传入参数重新分配值。使用临时局部变量。

public BankDTO loadTariff(BankDTO bankRequest, int[] executionLevels) {
    double[] fee = null;

BankDTO updatedBankRequest = bankRequest;

    for (int level : executionLevels) {

        fee = loadCokaAndBankFee(bankRequest,level);

        if (fee != null) { 
            updatedBankRequest = reloadBankRequest(bankRequest, fee);
            break; 
        }        }

    return updatedBankRequest;
}