避免重新分配参数

时间:2012-11-22 06:31:38

标签: java pmd

我得到了PMD红色违规

避免重新分配参数,例如'bankRequest'

这是我的方法

   @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;
}

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

5 个答案:

答案 0 :(得分:4)

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

有些人认为,将值赋给方法体内的参数是一种不好的方法,因为它有时令人困惑。一些开发人员更喜欢总是假设在方法运行期间从未为参数赋值任何值。

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

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

答案 1 :(得分:2)

您应该避免因已经给出的原因重新分配变量。无论如何,不​​要指定一个新的变量,而是考虑在找到正确的值时从循环返回。这也可以打破"打破"多余的。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

Example(s): 

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

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

答案 4 :(得分:0)

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

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;
}