问题:
要写一个工具类,准确一点说只能算是公共类,就是供其它多个类调用一些公用的方法。
一般常见的工具类,都只是一些方法,或者只有static 变量。 
但是我的这个工具类,还有一些变量,并且不想用static的(之所以不用static ,是因为,这些变量需要在不同情况下变化)。
但是该类的方法(static)中,又要访问这些变量(非static), 这样就出现了矛盾。解决方法:
1.硬把那些变量作为static,每次都要先new 该类的对象,重置他们的值(这样感觉失去了static 方法的意义)
2.写成Singleton的形式,方法为public 但是,Singleton 每次只能有一个实例,每次调用不同的方法时,变量要来回改变多次
3.把这个工具类当成一般的类处理,变量和方法都是public 的,每次用的时候,都要new 新的对象和设置变量的值。跟1差不多,只是1那样,一看就知道是个工具类。
其中,1,3 都存在要new 多个对象的问题。 因为这个工具类,调用的次数特别多,有点担心内存问题。同时也要不断的new 对象和设置变量的值
2呢,因为可能涉及到多线程或者同步(虽然暂时没有)有点担心其效率问题, 同样也要多次改变变量的值。想听听大家的建议,多谢

解决方案 »

  1.   

    定义一个或多个ThreadLocal变量:
    private static final ThreadLocal < Integer > uniqueNum = 
             new ThreadLocal < Integer > () {
                 @Override protected Integer initialValue() {//此方法可以没有
                     return new Integer(1);
             }
         };
    这中间的Integer是数据类型,你可以换成你需要的类型
    这个变量是每个线程一个,每个线程第一次访问此变量时,都会通过initialValue方法初始化此变量,因此不用担心线程安全和同步问题。
    这个变量看起来是静态的,实际对每个线程来说都是非静态的。
    当线程销毁时,此变量回收。
      

  2.   

    你可以把那些非静态的变量放到这个静态方法中,然后通过传入参数来改变这些变量。
    比如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;
    }
    }
    但是如果你这些变量必须是类成员的,那莫你这个方法就不能称为是工具,因为每一个实例都有自己的属性了。
      

  3.   

    但是我的这个工具类,还有一些变量,并且不想用static的(之所以不用static ,是因为,这些变量需要在不同情况下变化)。 那就不要做成static的变量就是了,定义成函数的局部变量就是了。或者参数也行啊如果数量有限的话,定义成多个static就是了
      

  4.   

    TO :lovecj6185  
    谢谢,你说得对, 这正是我的问题。
    这个类有点像工具类,但是又要有自己的成员变量,所以才不知道哪种选择更好。
      

  5.   

    是的,其实可以建立一个 business object 类,把那些成员变量分离出来,但是根据系统的结构,那样要做太多的工作,
    而这是一个小小MR,这个类只是从其他几个类里面抽出来公用部分,把他们凑到一起才出现在这个问题。我目前采用的前面提到的Singleton(虽然有点牵强),现在也不会涉及多线程问题,只是不知道以后,
    所以才考虑一种比较好一点儿的方法