将参数赋给另一个变量有什么好处

What is the benefit to assign the parameter to another variable

我正在阅读本网站的教程。http://tutorials.jenkov.com/java-unit-testing/matchers.html 我相信作者是很有经验的。我看到了这样的代码。我也看到别人总是喜欢把方法的参数赋值给变量,然后在方法内部使用。这是这条线。 protected Object theExpected = expected;

谁能告诉我,这种编码风格有什么好处?这是为了避免对象状态被更改还是什么?

如果参数不是对象而是原始变量怎么办。

如果它是像 String 这样的不可变对象呢?谢谢。

public static Matcher matches(final Object expected){

    return new BaseMatcher() {

        protected Object theExpected = expected;

        public boolean matches(Object o) {
            return theExpected.equals(o);
        }

        public void describeTo(Description description) {
            description.appendText(theExpected.toString());
        }
    };
}

这里是更新

我刚刚做了另一个测试,看看在我们得到对象后这个参数是否仍然可以访问。

package myTest;


public class ParameterAssignTest {

    public static void main(String[] args) {
        MyInterface myClass = GetMyClass("Here we go");
        System.out.println(myClass.getValue());
        System.out.println(myClass.getParameter());
    }

    public static MyInterface GetMyClass(final String myString){

        return new MyInterface() {

            protected String stringInside  = myString;

            @Override
            public String getValue() {
                return stringInside;
            }

            @Override
            public String getParameter() {
                return myString;
            }
        };
    }
}

输出:

Here we go
Here we go

这是否意味着即使我们将此参数分配给局部变量它仍然有效?

theExpected 是 primitive 还是 Object(虽然在这个例子中它是一个 Object)并不重要,也不管它是否可变。

matches 方法 returns 扩展 BaseMatcher 的匿名 class 实例(并实现 Matcher 接口,假设这是一个接口) .

一旦它 returns 实例,传递给它的局部变量 - expected - 超出范围,但是 theExpected 成员,包含与那个相同的值局部变量,保留在实例中,并且可以被该实例的方法使用。

如果您want/need在内部class中使用局部变量(在本例中为匿名局部class),该变量必须声明为final 无论它是原始类型还是引用类型。此处对此有更好的解释:Why Java inner classes require "final" outer instance variables?。引用IMO最佳解释:

The reason the language insists on that is that it cheats in order to provide your inner class functions access to the local variables they crave. The runtime makes a copy of the local execution context (and etc. as appropriate), and thus it insists that you make everything final so it can keep things honest.

If it didn't do that, then code that changed the value of a local variable after your object was constructed but before the inner class function runs might be confusing and weird.

在这种情况下,作者似乎希望在生成的匿名 class 引用中保留发送到方法的参数的副本以供进一步评估。方法完成执行后,参数 Object expected 不再可用,因此如果您 want/need 保留它,则必须将其分配到 class.[=14 的字段中=]

我认为分配给 theExpected 不会有任何效果。

正如预期的那样,它可以在匿名 class 中访问。如果它直接在 describeTo 中使用,则该对象不会被 GC,并且当 expected 声明的本地范围被保留时,该引用将保持有效。

可能 post 您 link 的作者认为这种明确的风格更具可读性。