0

在此示例中是否需要制作 fileName 参数的防御性副本?

public static Context getInstanceFromFile(final String fileName) 
throws IOException, FileNotFoundException, ContextException {
    if (fileName == null) {
        throw new NullPointerException("The fileName argument is null.");
    }
    return instance.loadParametersFromFile(String.valueOf(fileName));
}

理论上,另一个线程可以在调用该loadParametersFromFile方法之前修改文件名。是不是和之前一样不String.valueOf(fileName)被调用?

调用 loadParametersFromFile 时,如何确保在 fileName 中传递的值仍然相同?

4

2 回答 2

3

在 Java 中,字符串是不可变的,另一个线程无法修改fileName引用的值(因为它是调用方法的本地),因此防御性副本在这里绝对没有任何好处。

一般来说,防御性副本可以帮助避免这种情况,只要在正确的时间完成(当副本运行时没有其他线程可以修改实例时)。正如这个String例子所说明的,一个更好的防御方法是使传递的类不可变。

于 2014-02-18T09:49:54.367 回答
1

不,在 Java 中,字符串是不可变的(除非你用反射来破解它)。无需安全复制它。

于 2014-02-18T09:50:06.167 回答