2015-05-27 90 views
1

虽然我正在定义一个类,但我更愿意使用以下格式。类别变量与方法变量

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{ 

     } 

    } 

} 

我的问题是,这是更好,为什么?

+0

可能的重复http://stackoverflow.com/questions/5539652/using-a-class-variable-vs-sending-local-variable-to-functions-methods – Bikku

+0

有没有更好的办法。这取决于目的。问问你自己,这些变量是否属于我的班级? – JacksOnF1re

+0

添加到@azurefrog评论,这里有一些很好的理由,为什么私人更好地使用http://programmers.stackexchange.com/q/143736 – stackoverfloweth

回答

5

这完全取决于情况。通常可以使用可能的最小范围来定义变量。因此,除非您计划在方法外使用变量,否则只需将它们变为方法变量即可。

2

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

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

2

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

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

记住一个类级别变量实际上是一个“全局”变量(在类级别,如果是私有的话)以及与之相关的所有注意事项。不同的方法可以访问变量,并且可能很难确定哪一段代码正在设置值。

1

你的朋友代码很好。如果你正在创建局部变量,那么这些变量会随着你的方法和范围方法范围(最小范围)一起被加载到内存中。如果您创建的是需要单独存储到内存中的全局变量。

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

+0

虽然你是对的,但我不认为这回答了这个问题。 – JacksOnF1re

+1

我正在讨论如何将这些变量存储到内存中。 –

+2

你没有在讨论,你正在提供一个答案。也许添加评论。没有冒犯的意思。 – JacksOnF1re