当前位置: 技术问答>java相关
如何做到对象的唯一性?
来源: 互联网 发布时间:2015-08-03
本文导语: 我不知道这样的表述是否正确。还是举个例子说明吧 假设有class A.主要用于充当系统参数的管理存储者 有class B, class C...是实际的业务数据处理模块。 所有的业务数据处理class都需要从class A中得到部分和自身有关...
我不知道这样的表述是否正确。还是举个例子说明吧
假设有class A.主要用于充当系统参数的管理存储者
有class B, class C...是实际的业务数据处理模块。
所有的业务数据处理class都需要从class A中得到部分和自身有关的参数
如果这样写:
public class B{ public class C{
public B(){ public C(){
A a = new A(); A a = new A();
} }
} }
这样做的话,实际上内存里面有了两个a,也就是说在B、C需要用到A中存储的内容时,其实是建立了两个对象,分配了两块不相干的内存。B、C需要先构造a,然后运行a,使 a中得以有参数存放,然后再从a中去
这样的话A的存在是没有意义的
那么,能不能实现这样的要求:
系统初始化的时候A已经派生了一个对象a存在于内存中
如果B、C需要获得a中的信息,只需要引用a后,简单a.get***()就可以了
这样的话,a在内存中只有一份,系统运行中也不会有获取参数变量的开销了
谢谢
假设有class A.主要用于充当系统参数的管理存储者
有class B, class C...是实际的业务数据处理模块。
所有的业务数据处理class都需要从class A中得到部分和自身有关的参数
如果这样写:
public class B{ public class C{
public B(){ public C(){
A a = new A(); A a = new A();
} }
} }
这样做的话,实际上内存里面有了两个a,也就是说在B、C需要用到A中存储的内容时,其实是建立了两个对象,分配了两块不相干的内存。B、C需要先构造a,然后运行a,使 a中得以有参数存放,然后再从a中去
这样的话A的存在是没有意义的
那么,能不能实现这样的要求:
系统初始化的时候A已经派生了一个对象a存在于内存中
如果B、C需要获得a中的信息,只需要引用a后,简单a.get***()就可以了
这样的话,a在内存中只有一份,系统运行中也不会有获取参数变量的开销了
谢谢
|
Creating Singleton Using a Static Method
Another approach, suggested by Design Patterns, is to create
Singletons using a static method to issue and keep track of instances. To
prevent instantiating the class more than once, we make the constructor
private so an instance can only be created from within the static method of the
class.
class iSpooler
{
//this is a prototype for a printer-spooler class
//such that only one instance can ever exist
static boolean instance_flag = false; //true if 1 instance
//the constructor is privatized-
//but need not have any content
private iSpooler() { }
//static Instance method returns one instance or null
static public iSpooler Instance()
{
if (! instance_flag)
{
instance_flag = true;
return new iSpooler(); //only callable from within
}
else
return null; //return no further instances
}
//-------------------------------------------
public void finalize()
{
instance_flag = false;
}
}
Another approach, suggested by Design Patterns, is to create
Singletons using a static method to issue and keep track of instances. To
prevent instantiating the class more than once, we make the constructor
private so an instance can only be created from within the static method of the
class.
class iSpooler
{
//this is a prototype for a printer-spooler class
//such that only one instance can ever exist
static boolean instance_flag = false; //true if 1 instance
//the constructor is privatized-
//but need not have any content
private iSpooler() { }
//static Instance method returns one instance or null
static public iSpooler Instance()
{
if (! instance_flag)
{
instance_flag = true;
return new iSpooler(); //only callable from within
}
else
return null; //return no further instances
}
//-------------------------------------------
public void finalize()
{
instance_flag = false;
}
}
|
这实际上就是singleton模式的应用范畴:
public class A {
private static A instance;
private A()
{
xxx
}
public static synchronized A getInstance()
{
if(instance==null)
{
instance = new A();
}
return instance;
}
}
这样你在clsss B/C中可以使用:A a=A.getInstance();获得唯一对象实例。
public class A {
private static A instance;
private A()
{
xxx
}
public static synchronized A getInstance()
{
if(instance==null)
{
instance = new A();
}
return instance;
}
}
这样你在clsss B/C中可以使用:A a=A.getInstance();获得唯一对象实例。
|
呵呵,用简单的static关键字就可以了,让方法变成static,你可以脱离对象而存在了,也就是你可以a.getXXX()就可以直接使用了。System.out就是使用了static,如果要复杂一些,你可以采用Singlton设计模式。
|
可以用设计模式的中的single模式实现的。
|
同样,就用一个static的变量保存,每次new的时候检测对象是否存在