/** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;
/**
* Gets the array. Non-private so as to also be accessible
* from CopyOnWriteArraySet class.
*/
final Object[] getArray() {
return array;
}
/**
* Sets the array.
*/
final void setArray(Object[] a) {
array = a;
}
getArray()方法则直接返回成员变量 array。
我没明白为什么要再封装一层,而不是直接访问。
使用 getArray/setArray 方法有什么特殊含义吗?
1
hujianxin 2019-04-14 13:45:49 +08:00
因为一个是 list,一个是 array,楼主是来搞笑的吗?
|
2
cxtrinityy 2019-04-14 13:57:06 +08:00
你得理解 CopyOnWriteArrayList 实现 free lock 的原理,你 set/add element 的时候,实现如同名字所说,会把内部实际存储数据的 array copy 到新数组,这样你在多线程操作的时候才不会出现 ConcurrentModificationException,因为修改的是新的 array,修改完后通过 setArray 取代原来的 array
|
3
c4f36e5766583218 OP @hujianxin #1 我是说 getArray/setArray 内部源码也就一句话,为什么要封装成一个方法来使用呢?
你比如说 CopyOnWriteArrayList#toArray()这个方法 ``` public Object[] toArray() { Object[] elements = getArray(); return Arrays.copyOf(elements, elements.length); } ``` 为什么不写成 ``` public Object[] toArray() { Object[] elements = array; return Arrays.copyOf(elements, elements.length); } ``` |
4
wwqgtxx 2019-04-14 14:33:01 +08:00 via iPhone
java 的惯例吧,参见 java bean 的习惯,类本身不暴露内部成员,访问全部通过 setter 和 getter
|
5
c4f36e5766583218 OP @cxtrinityy #2 你说的是 CopyOnWriteArrayList 的实现原理,和我想问的貌似不知道影响不影响,参考下 3 楼回复。
|
6
MoHen9 2019-04-14 14:41:57 +08:00 via Android
应该是习惯,这么做可以统一控制 array 数组的访问,假如代码要扩展,比如说加锁,就可以在 get 方法中加,而不是每个使用到 array 变量的地方加锁。
|
7
cxtrinityy 2019-04-14 14:46:37 +08:00
这个只是基础的 getter/setter 模式吧,
|
8
beidounanxizi 2019-04-14 15:32:10 +08:00
恭喜你 你说的没错 😄 作者有点中二吧 我迄今为止无法沟通 setter getter 带来的工程意义
|
9
c4f36e5766583218 OP @beidounanxizi #8 你是说 java bean 无法理解吗?这个感觉说的蛮好的: https://www.zhihu.com/question/19773379/answer/31625054
|
10
hujianxin 2019-04-14 16:04:59 +08:00
刚才没理解楼主的意思,抱歉。
关于这个问题,查到网上只有一个 stackoerflow 问题聊到了,https://stackoverflow.com/questions/47030394/why-copyonwritearraylist-use-getarray-to-access-an-array-reference 不过也没有说出个所以然来。不过看到这两个方法都是 final 的,首先排除利用子类重写的方法这个理由。 至于有没有内存模型相关的考虑,我也没有看出来。 |
11
hujianxin 2019-04-14 16:06:36 +08:00
应该也不是 Doug Lea 的特殊癖好,因为他写的别的 class 也有很多直接访问私有属性的例子。
|
12
c4f36e5766583218 OP |