java - 这两个Java代码Snaps有什么区别吗?

标签 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);
}

谁能向我解释一下这里有什么区别吗?还有哪种方法更好,是否有任何差异,为什么?

最佳答案

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

两个程序执行相同的操作并产生相同的结果。不过,第二个解决方案更干净:没有理由返回作为参数传递的内容。事实上,调用者已经拥有对其作为参数传递的对象的引用,因此返回该对象是无用的,并且会导致困惑:为什么该方法返回 StringBuffer?这个 StringBuffer 与作为参数传递的 StringBuffer 相同,还是一个新的? StringBuffer 是作为修改后的参数传递的,还是该方法返回它的修改后的副本?

第二种方法没有所有这些歧义。

旁注:您不应该再使用StringBuffer。更喜欢 StringBuilder

关于java - 这两个Java代码Snaps有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20438957/

相关文章:

reference - Rust 可变值与可变引用

Scala collection.mutable.Cloneable 目的

java - 在 Eclipse 中的 Android 项目中使用预处理器

java - 如何在请求 Rest Web 服务时传递 xml

c - 共享 C 数组的最优雅方式

c++ - 使用全局声明的 vector 时 C++ 中的双重错误/损坏

Java 不确定类型的参数数量不确定

java - 通过java编写xml时处理特殊字符

java - spring jdbctemplate 获取字节数组

Python 全局变量似乎不能跨模块工作