问题:
要写一个工具类,准确一点说只能算是公共类,就是供其它多个类调用一些公用的方法。
一般常见的工具类,都只是一些方法,或者只有static 变量。
但是我的这个工具类,还有一些变量,并且不想用static的(之所以不用static ,是因为,这些变量需要在不同情况下变化)。
但是该类的方法(static)中,又要访问这些变量(非static), 这样就出现了矛盾。解决方法:
1.硬把那些变量作为static,每次都要先new 该类的对象,重置他们的值(这样感觉失去了static 方法的意义)
2.写成Singleton的形式,方法为public 但是,Singleton 每次只能有一个实例,每次调用不同的方法时,变量要来回改变多次
3.把这个工具类当成一般的类处理,变量和方法都是public 的,每次用的时候,都要new 新的对象和设置变量的值。跟1差不多,只是1那样,一看就知道是个工具类。
其中,1,3 都存在要new 多个对象的问题。 因为这个工具类,调用的次数特别多,有点担心内存问题。同时也要不断的new 对象和设置变量的值
2呢,因为可能涉及到多线程或者同步(虽然暂时没有)有点担心其效率问题, 同样也要多次改变变量的值。想听听大家的建议,多谢
private static final ThreadLocal < Integer > uniqueNum =
new ThreadLocal < Integer > () {
@Override protected Integer initialValue() {//此方法可以没有
return new Integer(1);
}
};
这中间的Integer是数据类型,你可以换成你需要的类型
这个变量是每个线程一个,每个线程第一次访问此变量时,都会通过initialValue方法初始化此变量,因此不用担心线程安全和同步问题。
这个变量看起来是静态的,实际对每个线程来说都是非静态的。
当线程销毁时,此变量回收。
比如public class Test5 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Tools.compute(1, 2);
}
}class Tools{
public static int compute(int a, int b){
int result = a+b;
return result;
}
}
但是如果你这些变量必须是类成员的,那莫你这个方法就不能称为是工具,因为每一个实例都有自己的属性了。
谢谢,你说得对, 这正是我的问题。
这个类有点像工具类,但是又要有自己的成员变量,所以才不知道哪种选择更好。
而这是一个小小MR,这个类只是从其他几个类里面抽出来公用部分,把他们凑到一起才出现在这个问题。我目前采用的前面提到的Singleton(虽然有点牵强),现在也不会涉及多线程问题,只是不知道以后,
所以才考虑一种比较好一点儿的方法