单例在编程中经常使用,但在全局变量中应用会出现一些问题。
例子:
public class Tst {
public static void main(String[] args) {
A.getInstance();
}
}
class Glbl {
static {
System.out.println("In class GlblVars");
}
public static String log = "I love java.";
public static A a = A.getInstance();
}
class A {
static int instanceNum = 0;
private A() {
instanceNum ++;
int n = instanceNum;
System.out.println(n +" create instance A");
System.out.println(Glbl.log);
System.out.println(n +" create instance A done");
}
private static A instance;
public static A getInstance() {
if (instance == null) {
System.out.println("In class A");
instance = new A();
}
return instance;
}
}
运行结果 写道
In class A
1 create instance A
In class GlblVars
In class A
2 create instance A
I love java.
2 create instance A done
I love java.
1 create instance A done
类A生成了,两个对象,因为在调用【A.getInstance();】的时候,给A初始化,A的构造函数中又使用了全局变量【Glbl.log】,这样java虚拟机就会载入类Glbl,这样就会把里面的static的变量a初始化,就又生成了一个A对象了。
关键点就是A的构造函数又引用了有A静态变量的类。
消除这个问题:
1,去除Glbl 中的静态变量A。【推荐这种因为A.getInstance();这种访问本来就是全局的了,没必要在画蛇添足。】
2,使用Glbl.a来访问A的实例,而不是【A.getInstance();】。
看了《Java与模式》好像采用“饿汉式单例”同样可以解决这个问题:
public class Tst {
public static void main(String[] args) {
A.getInstance();
}
}
class Glbl {
static {
System.out.println("In class GlblVars");
}
public static String log = "I love java.";
public static A a = A.getInstance();
}
class A {
static {
System.out.println("In class A");
}
static int instanceNum = 0;
private A() {
instanceNum ++;
int n = instanceNum;
System.out.println(n +" create instance A");
System.out.println(Glbl.log);
System.out.println(n +" create instance A done");
}
private static A instance = new A();
public static A getInstance() { return instance;}
}
结果:
In class A
1 create instance A
In class GlblVars
I love java.
1 create instance A done
分享到:
相关推荐
VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量...
用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。
在C++中,声明一个类,并且定义一个全局变量,练习全局变量的使用。注意全局变量的使用技巧和方法。
C语言面试题大汇总之华为面试题:1、局部变量能否和全局变量重名;2、如何引用一个已经定义过的全局...3、全局变量可不可以定义在可被多个.C文件包含的头文件中 为什么;4、语句for( ;1 ;)有什么问题 它是什么意思……
当时想到的就是使用全局变量,在 app.js 中定义好全局变量,点击组件页面时就修改全局变量的值,父页面同样使用全局变量的值,这样一来就可以动态打开/关闭弹出层且传递值了。 下面先看看 app.js 中怎么定义的: ...
讲述了static,extern及全局变量的用法,通过实例讲解,上机运行通过,放心使用
VB 全局变量举例 VB 全局变量举例 VB 全局变量举例
根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从...
全局变量、局部变量、静态全局变量、静态局部变量的区别
目标:在一个线程运行的时候,主程序或者另一个线程,通过改变全局变量实时改变目标变量的做法,在linux下用make编译
那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。
定义count变量是全局变量,定义temp变量是局部变量, 函数func1中引用全局变量count,函数func1中调用函数func2
在多文件项目中使用全局变量进行参数传递的方法总结
通过代码的运行,并理解代码,明白C中的局部变量与本地变量的区别
C语言中局部变量和全局变量 变量的存储类别 static extern auto register 使用
在A中定义有全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量? 答案:是两个不同的变量。 2. 工程中包含动态库A,动态库B,可执行程序C。C依赖于A和...
2: 缩小命名空间 单例模式是对全局变量的一种改进,它避免了那些存储唯一实例的全局变量污染命名空间. 3: 允许对操作和表示的精华 单例类可以有子类. 而且用这个扩展类的实例来配置一个应用是很容易的,你可以用你所...
Spring MVC配置Freemarker全局变量,实现应用全路径
labview功能性全局变量的详细使用,避免局部变量的数据争抢