问题描述
- 关于java的匿名内部类和泛型
-
public class Counter {private static ThreadLocal<Integer> counterContext = new ThreadLocal<Integer>(){ protected synchronized Integer initialValue(){ return 10; } };
}
请教下上面这个类当中的这个匿名内部类起了什么作用,这个return 的10是传给了谁了呢?另外关于ThreadLocal中的这个泛型的用法不是很理解,我对泛型的理解仅仅是 ArrayList这类集合的泛型,说明里面只能存放String,对于ThreadLocal这种类的泛型又是什么意思呢?是ThreadLocal里面的某一个成员变量只能是Integer吗?
解决方案
首先,这端代码本质上是定义了一个ThreadLocal变量,等价于:
private static ThreadLocal<Integer> counterContext = new ThreadLocal<Integer>()
这样的话它使用的就是ThreadLocal的默认的initialValue方法指定的值。
其次,你这里的代码相等于实例化了一个ThreadLocal类型的匿名类,并重写了它的initialValue方法,这里的return 10并没有传给谁,而是整个方法声明需要返回一个初始化值。这个方法会在某个线程第一次调用get操作时返回。API的说明是这样的:
Returns the current thread's "initial value" for this
* thread-local variable. This method will be invoked the first
* time a thread accesses the variable with the {@link #get}
* method,
解决方案二:
这是一种技巧,counterContext因为是static类型的,所以jvm可以保证它只有一个实例。synchronized保证了initialValue是同步调用的,并且返回10。
解决方案三:
java匿名内部类
java匿名内部类
JAVA中的匿名内部类
解决方案四:
Orz这个匿名类感觉看不懂,所以我决定强行回答泛型的问题
泛型是指你可以写出不关心类型的代码,在实际需要的时候往里面放置任何类型,比如说链表结构,我并不需要知道需要组成链表的集合是什么类型的,因为这不重要,但是我需要定义下一个节点的对象的类型是链表集合的类型,这时候就可以用泛型,先定义一个不确定的类型,直接使用这个类型来写代码。最终要用这个对象的时候通过 对象名<类型>来指定最终往泛型对象里传递什么类型,而不是一开始就在代码里写死
那么里面只能放String这个理解似乎是有问题的...泛型本身应该是指可以存放任意类型
至于ThreadLocal,百度找了个博文有具体解释:http://blog.csdn.net/lufeng20/article/details/24314381
我不懂就不强答了,感觉似乎其他问题里面有解释