Java中的闭包&不可变的字符串。这个程序如何运作?

时间:2014-05-19 12:36:12

标签: java closures

这是程序

public class Closure {

     public String foo = "";

     public static Closure process(final Closure t) {
          System.out.println(t.toString() + " = " + t.foo);
          t.foo = "bar";
          new Runnable() {
             public void run() {
                System.out.println(t.toString() + " = " + t.foo);
                t.foo = "baz";
             }
          }.run();
          System.out.println(t.toString() + " = " + t.foo);
          return t;
     }

    public static void main(String[] args) {
       process(new Closure());
    }

}

当我执行它时,所有3个打印显示变量t.foo的相同参考。这对于闭包来说是有意义的,它正如我们所期望的那样。

让我感到困惑的是,Java Strings是不可改变的。因此,如果我们重新分配字符串,参考不应该改变吗?

3 个答案:

答案 0 :(得分:1)

当问题不包含任何闭包时,使用Closure会有点混乱。

程序的输出应该是这样的(Ideone想要一个具有此名称而不是Closure的类)

Ideone@1e61582 = 
Ideone@1e61582 = bar
Ideone@1e61582 = baz

请参阅http://ideone.com/c5HzEF

正如您所看到的,参考foo正在发生变化。您打印的参考t不会按预期更改。

答案 1 :(得分:0)

不,因为您打印的是Closure对象的引用,而不是String的引用。

答案 2 :(得分:0)

foo属性是一个引用。这是对字符串在Java中不可变的含义的误解。

请参阅Immutability of Strings in Java