关于getInstance()方法

bloodrate 2007-12-19 08:23:13
很多类里都有 public static XXX getInstance(){ ...... return this;}
这样的静态方法,来获得该类的实例,那么为什么不选用XXX xxx=new XXX();的方法来获得实例呢?是不是因为XXX类往往是抽象类而不能new,但是又想用它的实例?
...全文
19587 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
yowyuil 2012-06-18
  • 打赏
  • 举报
回复
getInstance 当一个对象使用的时候和当成一个函数使用的时候用什么区别呢?
Eureal 2012-05-09
  • 打赏
  • 举报
回复
老帖子了 貌似越看越复杂
lgc8023 2012-05-09
  • 打赏
  • 举报
回复
我们将构造函数的修饰符设为了private,也就是外部不能通过new ()直接实例化对象,而只能是通过getInstance()来进行。
搭火箭看日出 2011-04-15
  • 打赏
  • 举报
回复
学习!
zzh200411 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 huazhiyu1981 的回复:]
我也学习了。懂了一些。
[/Quote]
+1
huazhiyu1981 2010-03-30
  • 打赏
  • 举报
回复
我也学习了。懂了一些。
zhangy729 2010-03-03
  • 打赏
  • 举报
回复
菜鸟学习了,似懂非懂的状态
liwenzhen414 2009-10-23
  • 打赏
  • 举报
回复
sdfsdf
zhengbinxu 2008-12-23
  • 打赏
  • 举报
回复
还是不是很明白,请问可以不可以说详细一点....
kunlaurel 2008-12-09
  • 打赏
  • 举报
回复
学习了…………
skycray 2007-12-28
  • 打赏
  • 举报
回复
单子模式
把构造方法私有
用getInstance()来得到
保证只有一个对象的产生···
别的类要调用到它的话,只能用A.getInstance()来拿到它的对象··
不能用new
hanfengthinker 2007-12-22
  • 打赏
  • 举报
回复
单子设计模式
或为了工厂模式的需要
weijiepeng 2007-12-20
  • 打赏
  • 举报
回复
getInstance() 不完全是单子模式
你可以直接看JDK里面怎么写的
sunny5200 2007-12-20
  • 打赏
  • 举报
回复
这样用的目的和结果是:保证系统中永远都只会有一个该类的实例,sun的教材称为(Singleton)单子模式,要使用这种模式实现保证对象的单一性的两个要点是1.getInstance()一定是static的,2.构造方法必须是private的,保证用户只能通过static方法getInstance()来取得该类的唯一实例,而不能通过常规的new XXX()来实例化,象这样的不论定义多少个引用,
A a1=A.getInstance();
A a2=A.getInstance();
………
……
……

它的引用总是引用的同一个的对象(static变量总是会在类载入内存时就首先进行初始化),不论有多少个都是同一个对象。
第一次回答,不知道说明白了没有。
bloodrate 2007-12-20
  • 打赏
  • 举报
回复
按照6楼的说法

它的引用总是引用的同一个的对象(static变量总是会在类载入内存时就首先进行初始化),不论有多少个都是同一个对象。
第一次回答,不知道说明白了没有。



A a1=A.getInstance();
A a2=A.getInstance();

如果我这么写的话,a1,a2实际上是同一个对象的不同引用,那么a1改变了,a2也跟着改变了,类似指针?
sunny5200 2007-12-20
  • 打赏
  • 举报
回复
你说的是表面体现,从外部体现上说就是这样的,我上边已经说过了,这种模式的构造方法是private的,就意味着 你不可能通过A a1=new A(); 这样的方式获得该类的实例,你只能通过A.getInstance();的方式来获得这个类的事例,这也就意味着,不论A1,A2,A3……引用的都是同一对象,得到的值当然是同样的了,也就是说你不论是对a1,a2进行操作都操作的是同一对象。
老紫竹 2007-12-20
  • 打赏
  • 举报
回复
getInstance() 提供一个获得对象实例的统一方式,类似Factory的。

最典型的是Calendar, 我贴部分代码如下

public static Calendar getInstance()
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
cal.sharedZone = true;
return cal;
}

private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
// If the specified locale is a Thai locale, returns a BuddhistCalendar
// instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
return new sun.util.BuddhistCalendar(zone, aLocale);
}

// else create the default calendar
return new GregorianCalendar(zone, aLocale);
}


可见,getInstance 只是一种得到实例的方法而已,不一定都是singleton 模式
bloodrate 2007-12-20
  • 打赏
  • 举报
回复
比如说
A a1=A.getInstance();
A a2=A.getInstance();

a1.getValue=5;
a2.getValue=5;
a1.add(1);
a1.getValue=6;
a2.getValue=6;
楼上是不是这个意思??

A a1=new A();
A a2=a1;
和上面说的是不是就是一致的?
sunny5200 2007-12-20
  • 打赏
  • 举报
回复
9楼的说法还是有点问题


A1,A2,都是只是引用,而不是真正的对象,他们的共同点是,引用的对象是同一个,准确的说,是A1引用的对象改变了,意味着A2引用的对象也改变了,因为他们引用的是同一个对象,而你说的,A1改变,A2跟着改变的说法是有问题的,因为A1引用和A2引用 两个引用本身是没有关系的,比如A1,跑去引用NULL了,而A2,依然引用的是原来的那个对象,对象本身没有改变。引用的确类似于指针,它们存贮都是实际对象的内存地址,而不是对象本身,不知道说明白了没有。
bloodrate 2007-12-19
  • 打赏
  • 举报
回复


一般是这样用
Class Afactory{
A a=null;
public getA(){
if(A!=null){
a= new A();
return a;
}else{

return a;
}
}
}

这样如果调用两次getA()的话实际上是一个对象有两个引用?
加载更多回复(4)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧