面的辅助线。
如果基于性能的考虑,避免每次调用的时候为临时变量分配空间,就可以将它声明为成
员变量,例如临时压缩缓冲区。
如果基于性能的考虑,避免每次访问的时候访问成员变量(尤其在循环的时候),就可
以将它声明为临时变量。
如果要在避免在函数之间传递大量参数,也可以用成员变量来节约参数个数和占用的空
间
我认为同意那个高手的意见.全局变量是不应该使用的.
在java中也不存在全局变量的概念.
如果是全局的就用单例.
全局变量会导致使用的扩散,无法控制对该变量的调用.
而且对于现在的趋势,硬件的成本远远低于软件的成本.
原来楼主要讨论的是变量是应该在方法外声明还是在方法内声明
面向对象程序设计中,我不习惯再叫什么‘全局变量’。而叫类成员。在同一个类当中,只要能够使用(
义公用、静态的变量来实现一个全局变量。例如 :
public static global_var;
}
可以访问和修改该变量。
这是全局变量的定义,如果有可能的话,尽量使用局部变量为好
“private HashMap hm;//呵呵,我称此种为全局变量”
> >
错了,其实不完全是这样的。因为很有可能这个类本身的存在,就是面向对象的一个部分。比如,俺给你
一个配置加载的类比如说ConfigLoader从配置文件中加载配置信息,配置可能是这样的nv对:
name : value.
作为客户来说,并不需要关心这个value是什么,可能只是需要根据这个value创建出来的一些结果,比如
那么通常ConfigLoader这么做:假设使用HashMap来存储:
final Map map = new HashMap();
// ... 读取配置文件的内存
for(each:...) {
String name = each.getName();
String value = each.getValue();
Object actualValue = build(value);
map.put(name, actualValue);
}
Object build(String value) {...}
// ..
这样是一种通常的做法,但是如果细了说,ConfigLoader这个类实际上有两个职责了:
(1) 加载配置文件。
(2) 根据指定的value来构建对象实例。
可能会导致的问题是,第一构建方法的变化会导致ConfigLoader这个不相关的类的修改,第二,对单元测
class Builder {
Object build(String value) {...}
}
刚才的程序片断就简单变为:
map.put(each.getName(), new Builder().build(each.getValue());
这样,即便构建的逻辑发生变化,对于ConfigLoader来说是没有任何影响的。
另外,也有变成面向过程的编程,通常就是俺们经常使用的工具类,就是做的面向过程的事情。
final public class Utils {
private Utils() {}
public static void someMethod(...) {...}
}
这个someMethod就是一个典型的面向过程的东西。
当然要记住,这样的写法并不是完全不可取的。。在需要的场合,很大程度上这样是一个不错的解决方式
再说了,我经常看到有类似下面的声明:
private String s;
protected HashMap hm;
private List list;
public ... ...
public Test(){
s = "test ";
hm = new HashMap();
list = new ArrayList();
... ...
}
}
jvm对于内存资源的回收需要等待一个collection周期,而不是实时回收。
如果对一个变量的使用率频繁建议使用全局。可以节省CUP分配内存空间的时间。
如果使用局部变量。虽然在整个程序运行期内存资源消耗减少。可是CUP要花更多时间用在内存资源分配上
过去,使用面向过程的编程方法时,时常讨论“局部变量”和“全局变量”的问题。
谢谢上面的朋友们:
2.最少通信原则
“变量是全局的还是局部的,和多线程调用并无关系,到时只要在总方法上加上synchronized就
好,而且,即使变量是局部的,要是多线程调用时,也得加上同步不是?”
再次谢谢大家的发言~
局部变量是避免多线程造成变量非同步操作错误的有效措施
要看那种情况,假如你的这个变量是作为循环体内使用,那么用“全局”吧,如:
Student student=null;
for(Iterator iter=datas.iterator();iter.hasNext();){
student=(Student)iter.next();
}
这样可以节约时间,不用没一次循环都要在栈中申请空间以存储引用;
假如是在类一级的,比如作为类的属性还是方法的变量,原则是假如方法的参数不是很多的话,那么采用方法传递,楼主也说了,可以采用多线程或是池。
使用java也有两年了,以前是用局部变量多一点,后来自己体会到,还是全局变量更能体现面向对象的思想:类的内部应该体现强耦合性,类和类之间应该体现弱耦合性;再说了,每个类要是只是方法堆砌出来的,也没有意思了。
1.全局变量始终占用内存,多了一笔开销
2.我们写的类到时候要被多线程调用的,所以局部变量更好一点
而且,变量是全局的还是局部的,和多线程调用并无关系,到时只要在总方法上加上synchronized就
好,而且,即使变量是局部的,要是多线程调用时,也得加上同步不是?
很久之前就开始遵循一个原则:变量的最小作用域原则。
即是尽量不要扩大一个变量的可见范围。