在我定义课程时,我更喜欢使用以下格式。
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 :(得分:5)
这完全取决于具体情况。使用最小范围定义变量通常是个好主意。因此,除非您计划在方法之外使用变量,否则只需将它们设为方法变量。
答案 1 :(得分:2)
如果变量仅由process()方法使用,那么您朋友的建议会更好。您通常应该始终使用最小的范围。
通过使它们成为类的属性(正如你所做的那样),你在堆上使用了不必要的空间,并且使得类非线程安全而没有从中获得任何好处。
答案 2 :(得分:2)
您的班级变量将在班级的生命周期内存在。如果您需要通过getter / setter访问变量,或者不同的方法需要访问相同的数据而不是使其达到类级别。否则使它成为方法级别。方法级别或局部变量在方法的堆栈上声明,可以是基本类型或对象的引用。它们在调用方法时存在或范围,并在方法退出时停止存在。尽管GC引用的对象可能是GC,但GC并未参与其中。
测试仅使用方法级变量的类更容易。
请记住,班级变量实际上是一个全球性的变量。变量(在类级别,如果是私有的)以及随之而来的所有警告。不同的方法可以访问变量,可能很难确定哪一段代码正在设置值。
答案 3 :(得分:1)
你的朋友代码很好。如果要创建局部变量,那么这些变量将与方法和范围以及方法范围(最小范围)一起加载到内存中。如果您创建了全局变量,那些需要分别存储到内存中。
如果你只想在一个方法中使用,那么最好创建局部变量而不是使用类变量。