当我没有任何实例变量时,我可以使用静态方法吗?

时间:2011-07-26 06:50:49

标签: java

我有一个课程如下

class Myclass{
  //no instance  variables
 static boolean  validate(MyObj oj){
    //impl
   }

}
  1. 现在如果2个线程同时调用具有不同参数的静态方法Myclass.validate(param),它会正常工作吗?如果是/否,怎么样?
  2. 我的方法是否正确?我想在这种静态方法中加入一些验证逻辑或一些自定义转换实用程序。

4 个答案:

答案 0 :(得分:2)

如果您没有任何实例变量,则可以使用实用程序类。

public enum Utility {;
   public static boolean validate(MyObj obj) ....

}

然而,更好的方法是将方法移动到第一个参数类型,如果可以的话。

public class MyObj {

   public boolean validate() ....
}
  1. 如果不共享参数,则两个线程可以在没有线程安全问题的情况下调用相同的方法。
  2. 如果要进行验证或转换,如果您需要多种方式来验证或转换MyObj类型,则可以选择实用程序类。

答案 1 :(得分:1)

1-调用是安全的,因为obj参数是方法的本地参数。但是要确保

  • 不同的线程不共享Obj。如果是,那么状态不是 改性。 (应该是不可改变的)
  • 对象re3fernce不传递给任何外来方法,其中 可能不是线程安全的。
  • 您可以将参数标记为最终。

2-对于没有任何状态的类,可以使用静态方法。

答案 2 :(得分:0)

  1. 是的,它会正常工作。传递给方法的参数存在 一个称为“堆栈”的内存区域,每个线程都有自己的内存区域 叠加。
  2. 我会说是的

答案 3 :(得分:0)

您的用例非常适合实用类,并且实用程序类方法是静态的,这将有助于您在不实例化的情况下使用该类(因此避免了对象乱丢垃圾和GC开销)。     由于您使用任何共享变量(类变量),因此线程安全不是问题。所以你这样安全。

所以#1和2#都能正常工作。