Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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_Object_Methods_Parameters_Code Standards - Fatal编程技术网

Java 将参数指定给另一个变量有什么好处

Java 将参数指定给另一个变量有什么好处,java,object,methods,parameters,code-standards,Java,Object,Methods,Parameters,Code Standards,我正在阅读这个网站的教程。 我相信作者很有经验。我看到了这样的代码。我还看到其他人总是喜欢将方法的参数指定给变量,然后在方法内部使用它。这是这条线受保护对象预期=预期 谁能告诉我,这种编码方式有什么好处?这是为了避免对象状态被更改还是什么 如果参数不是对象而是基本变量,该怎么办 如果它是像字符串这样的不可变对象呢。多谢各位 public static Matcher matches(final Object expected){ return new BaseMatcher() {

我正在阅读这个网站的教程。 我相信作者很有经验。我看到了这样的代码。我还看到其他人总是喜欢将方法的参数指定给变量,然后在方法内部使用它。这是这条线<代码>受保护对象预期=预期

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

如果参数不是对象而是基本变量,该怎么办

如果它是像字符串这样的不可变对象呢。多谢各位

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

那么这是否意味着即使我们将这个参数指定给一个局部变量,它仍然有效

无论预期的是原语还是对象(尽管在本例中它是一个对象),也不管它是可变的还是不可变的

matches
方法返回扩展
BaseMatcher
的匿名类的实例(并实现
Matcher
接口,假设该接口是一个接口)


一旦它返回实例,传递给它的局部变量-
预期的
-就超出了范围,但是
预期的
成员(包含与该局部变量相同的值)保留在实例中,并且可以由该实例的方法使用。

如果您希望/需要在内部类中使用局部变量(在本例中为匿名本地类),变量必须声明为
final
,无论它是基元类型还是引用类型。此处对此进行了更好的解释:。请引用以下最佳解释:

该语言坚持这样做的原因是为了让您的内部类函数能够访问它们所需要的局部变量而进行欺骗。运行时制作了一份局部执行上下文的副本(等等,视情况而定),因此它坚持让所有内容都是最终的,这样就可以保证事情的真实性

如果它没有做到这一点,那么在构建对象之后但在运行内部类函数之前更改局部变量值的代码可能会令人困惑和奇怪


在这种情况下,作者似乎希望在生成的匿名类的引用中保留发送给该方法的参数的副本以供进一步计算。一旦该方法完成其执行,预期的参数<代码>对象<代码>将不再可用,因此如果您希望/需要保留该参数,则必须将其分配到y字段中我们班。

我不相信分配给
预期的
能取得任何效果

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


可能你链接到的帖子的作者认为这种显式风格更具可读性。

但是参数被声明为final。我认为问题是“为什么不直接编写
expected.equals(o)
?@realpoinsist我还在写答案。我倾向于写一些东西,发布它,然后编辑以添加更多信息。谢谢你的解释。我现在明白了。而且@realpoinsist在这里有一个很好的观点,我也想听听你对此的看法。如果这与内部类无关,那它只是内部的一个普通公共方法呢e一个普通类。谢谢。@TechNoob如果这与内部类无关,它只是普通类中的一个普通公共方法,那么就不需要
保护对象expected=expected;
首先,您将直接将对象分配到类中的一个字段中(如果需要)它看起来更像是一个setter方法,或者您将直接使用对象,而不是将其分配到temp变量中。但这似乎更像是一个单独的问题。我还想补充一点,这里使用的是
受保护的
,这似乎有点可疑-无法从匿名类继承。感谢您的解释。我现在明白了。如果这与Matcher或内部类无关,那么它只是普通类中的一个普通公共方法。我们还是这样做吗?谢谢。@TechNoob,有setter方法用于修改类的成员,所以在这种情况下,您仍然会将传递的参数分配给实例变量。另一方面,其他方法只使用一次参数,而不存储它(例如,请参阅代码中
匹配的
方法的
o
参数).@Eran虽然expected移出了作用域,但它指向的对象仍然存在,并且它仍然可以从匿名类中访问
expected
。我不相信分配给expected有任何功能用途-expected可以直接使用。@Luigimendoza它如何帮助调试?嗨@Eran,你能检查我的更新吗,这是否意味着即使我们不将参数赋给局部变量,也可以在类创建后保留参数?谢谢。嗨@henry,我刚刚做了一个小测试,这证明了你的正确性吗?