类变量与方法变量

时间:2015-05-27 14:59:32

标签: java

在我定义课程时,我更喜欢使用以下格式。

public class ClassName{

   private String             var1 = null;
   private Map<String,String> map1 = null;

   public void process(){

      try{
           var1 = "Variable1";
           map1 = new HashMap<String,String>();

            // Do Some Stuffs Here with the varaibles.

      } catch(Exception e){
           e.printStackTrace();
      } finally{
           var1 = null;
           map1 = null;
      }

   }

}

但是我的朋友建议我使用以下方式,

public class ClassName{

   public void process(){

      String             var1 = null;
      Map<String,String> map1 = null;

      try{
           var1 = "Variable1";
           map1 = new HashMap<String,String>();

            // Do Some Stuffs Here with the varaibles.

      } catch(Exception e){
           e.printStackTrace();
      } finally{

      }

   }

}

我的问题是哪个更好,为什么?。

4 个答案:

答案 0 :(得分:5)

这完全取决于具体情况。使用最小范围定义变量通常是个好主意。因此,除非您计划在方法之外使用变量,否则只需将它们设为方法变量。

答案 1 :(得分:2)

如果变量仅由process()方法使用,那么您朋友的建议会更好。您通常应该始终使用最小的范围。

通过使它们成为类的属性(正如你所做的那样),你在堆上使用了不必要的空间,并且使得类非线程安全而没有从中获得任何好处。

答案 2 :(得分:2)

您的班级变量将在班级的生命周期内存在。如果您需要通过getter / setter访问变量,或者不同的方法需要访问相同的数据而不是使其达到类级别。否则使它成为方法级别。方法级别或局部变量在方法的堆栈上声明,可以是基本类型或对象的引用。它们在调用方法时存在或范围,并在方法退出时停止存在。尽管GC引用的对象可能是GC,但GC并未参与其中。

测试仅使用方法级变量的类更容易。

请记住,班级变量实际上是一个全球性的变量。变量(在类级别,如果是私有的)以及随之而来的所有警告。不同的方法可以访问变量,可能很难确定哪一段代码正在设置值。

答案 3 :(得分:1)

你的朋友代码很好。如果要创建局部变量,那么这些变量将与方法​​和范围以及方法范围(最小范围)一起加载到内存中。如果您创建了全局变量,那些需要分别存储到内存中。

如果你只想在一个方法中使用,那么最好创建局部变量而不是使用类变量。