java - 共享可变状态有什么问题?

标签 java oop

Java并发实践第3章中,作者建议不要共享可变状态。此外,他还补充说,下面的代码不是共享状态的好方法。

class UnsafeStates {

    private String[] states = new String[] {
      "AK", "AL"
    };

    public String[] getStates() {
        return states;
    }
}

摘自书中:

Publishing states in this way is problematic because any caller can modify its contents. In this case, the states array has escaped its intended scope, because what was supposed to be private state has been effectively made public.

我的问题是:我们经常使用 getter 和 setter 来访问类级别的私有(private)可变变量。如果这不是正确的方法,那么共享状态的正确方法是什么?封装的正确方法是什么states

最佳答案

对于原始类型,intfloat 等,使用像这样的简单 getter 不允许调用者设置其值:

someObj.getSomeInt() = 10; // error!

但是,对于数组,您可以从外部更改其内容,根据具体情况,这可能是不可取的:

someObj.getSomeArray()[0] = newValue; // perfectly fine

这可能会导致字段被代码的其他部分意外更改的问题,从而导致难以跟踪的错误。

您可以做的是返回数组的副本:

public String[] getStates() {
    return Arrays.copyOf(states, states.length);
}

这样,即使调用者改变了返回数组的内容,对象所持有的数组也不会受到影响。

关于java - 共享可变状态有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729837/

相关文章:

android - Java Restful Web 服务仅运行 Android 4.4 Mobile 而不是其他

java - 可执行 jar 不显示应用程序中使用的图标/图像

ruby - 如何确定一个对象是否为 PORO?

java - 动态选择对象

java - Java中的executeBatch不维护记录的顺序

java - MySql 数据在第 1 行的 'value' 列被截断

java - 如何使用表单工具包更改复合 Material 的边框颜色?

java - 如何找回 "Eclipse >Generate>Jaxb classes"选项?

oop - 类数据在内部传递好还是直接访问好?

JavaScript:如何在不使用 new 关键字的情况下创建类的新实例?