这两个Java代码Snaps之间有什么区别吗?

时间:2013-12-07 07:36:42

标签: java global-variables mutable

1

public static StringBuffer setString2(StringBuffer s)
{
    s.append("::1st word");
    return s;
}

static StringBuffer sbGlobal = new StringBuffer("before");

public static void main(String[] args)
{   
    System.out.println(setString2(sbGlobal));
}

2

public static void setString(StringBuffer s)
{
    s.append("::1st word");
}

static StringBuffer sbGlobal = new StringBuffer("before");

public static void main(String[] args)
{
    setString(sbGlobal);
    System.out.println(sbGlobal);
}

有人可以向我解释,这里有什么不同吗?还有哪种方法更好,如果有任何差异,为什么?

2 个答案:

答案 0 :(得分:2)

StringBuffer是一个可变类。 setString2()方法将StringBuffer作为参数,修改它,并返回它。 setString()方法将StringBuffer作为参数,修改它,但不会返回它。

两个程序都做同样的事情并产生相同的结果。第二种解决方案更清晰:没有理由返回作为参数传递的内容。实际上,调用者已经引用了它作为参数传递的对象,因此返回此对象是无用的,并导致混淆:为什么该方法返回StringBuffer?这个StringBuffer和作为参数传递的StringBuffer是一个新的吗? StringBuffer是作为参数修改传递的,还是返回它的修改后的副本的方法?

第二种方法并不具备所有这些含糊之处。

旁注:您不应再使用StringBuffer了。请改为StringBuilder

答案 1 :(得分:0)

 public static StringBuffer setString2(StringBuffer s)
    {
        s.append("::1st word");
        return s;
    }

上面的方法返回StringBuffer对象,该对象由append方法修改。所以在你做的时候

System.out.println(setString2(sbGlobal));

返回了StringBuffer对象,该对象附加了一些String并且正在打印。

在第二种情况下,没有返回类型及其void

public static void setString(StringBuffer s)
    {
        s.append("::1st word");
    }

所以声明

 System.out.println(setString2(sbGlobal)); //compile error because of void

致电时

 setString(sbGlobal);

修改StringBuffer对象,现在打印sbGlobal对象

System.out.println(sbGlobal);