这种做法有何优点?构造函数设成private,然后通过静态方法来调用此private构造函数返回reference.

JCC0128 2004-01-11 03:47:06
标题:
这种做法有何优点?构造函数设成private,然后通过静态方法来调用此private构造函数返回reference.

内容:

B.下述这种做法的优点何在?在外面直接调用构造函数会出什么问题吗?我现在的疑问就是直接调用构造函数会有什么隐患? 我感觉两种方式并没有本质的差别 ,最后都返回了对象的reference.
**做法**:将构造函数设置成private权限,然后通过helper方法来调用构造函数,例子如下。

本人认为:一般的方式需要new来创建对象,后面的方式不需要new 呵,简单些~不过这跟TIJ3中的意思不合,它好像还是说直接调用构造函数不好。

class Sundae {
private Sundae() {}
static Sundae makeASundae() {
return new Sundae();
}
}

public class IceCream {
public static void main(String[] args) {
//! Sundae x = new Sundae();
Sundae x = Sundae.makeASundae();
}
} ///:~

PS:问有的网友这个问题时,网友说构造函数是private权限当然不能在外调用,当然这个我可以直接修改其访问权限为public即可,这个并不是问题。
...全文
372 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
free111 2004-06-25
  • 打赏
  • 举报
回复
xyjbn(无聊也是一种错) 怎么说话呢?????????????
javafaq2004 2004-06-25
  • 打赏
  • 举报
回复
关注一下。
Leemaasn 2004-01-11
  • 打赏
  • 举报
回复
是啊。

试试楼上的?



Up。。。

^@^
JCC0128 2004-01-11
  • 打赏
  • 举报
回复
父类用来创建对象的静态成员函数,调用父类的虚拟clone方法呢?效果自己考虑。

===========
惭愧 ,还不知道clone方法,先记下来,谢谢zengpan_panpan的解答呵!
zengpan_panpan 2004-01-11
  • 打赏
  • 举报
回复
A 里面提到的“以后可根据需要在此处加代码” 不一定正确。

例如:
父类用来创建对象的静态成员函数,调用父类的虚拟clone方法呢?效果自己考虑。
lantian1979 2004-01-11
  • 打赏
  • 举报
回复
up
JCC0128 2004-01-11
  • 打赏
  • 举报
回复
现整理如下,请各位指正:


A.为扩展
封装的目的是为了,应对变化,将new 封装, 目的是封装new的过程, 意义不言自明
new的过程 ,可能会变化,所以用了工厂模式 ,此处封装的目的主要是为了扩展,以后可根据需要在此处加代码呵

B.如果父类只有private的构造函数,则绝对不允许继承此类!
假设要继承则需自动合成父类的构造函数或显示调用父类的构造函数,但父类的构造函数对子类不可见,不能完成自动合成,所以不允许继承。
iamwls 2004-01-11
  • 打赏
  • 举报
回复
哦,看错了,是factory模式

封装的目的是为了,应对变化,
将new 封装, 目的是封装new的过程, 意义不言自明
呵呵
iamwls 2004-01-11
  • 打赏
  • 举报
回复

这是单例模式的标准实现

参见《设计模式》

目的为限制客户程序员new Object
wobelisk 2004-01-11
  • 打赏
  • 举报
回复
2. prevent a class from being inherited.
wobelisk 2004-01-11
  • 打赏
  • 举报
回复
Private constructors are used to:
1. prevent a class from being explicitly instantiated by users of the class
2. precent from being inherited.

The class with private constructors has similar effect with a final class. And two things always combined together. You can refer to the source code of java.lang.System or Math class.

And singleton pattern implementation in java will ofter use private constructors, though other constructors are used rarely to allow inheritance.
zengpan_panpan 2004-01-11
  • 打赏
  • 举报
回复
1. 要仅创建一个实例当然还需要在makeObject的静态方法里面限制一下啦,比如没有创建才创建,创建好了就直接返回。

2. 用户通过定义的静态方法来完成类似于继承的实现,实际上不是继承,而是包裹。或者说聚集。

3. 这种方法可以防止任意创建对象,可以对创建的对象进行精确管理,例如你前面说到的线程池。你可以把创建的对象,放到该类的一个静态容器中,这种灵活性自己考虑了。

4. 通过一个串表达的名字,获取一个以该名字命名的对象,比如MessageDigest类里面的
static MessageDigest getInstance(String algorithm);
Gigle 2004-01-11
  • 打赏
  • 举报
回复
3.是“这样只有它自己可以实例化类”
Gigle 2004-01-11
  • 打赏
  • 举报
回复
1.该类确实可以有多个实例,是multiton,先前我看错了。
2.构造函数设为private的用意是控制这个类的实例化过程,即该类不允许继承,只能通过静态方法得到该类的实例,通过定制构造函数达到控制实例化的目的。
JCC0128 2004-01-11
  • 打赏
  • 举报
回复
第五章看完了,得出如下看法,其中b是最重要的!

不知道是否正确,请指正!

a.一般的方式需要new来创建对象,后面的方式不需要new 呵,简单些~不过这跟TIJ3中的意思不合,它好像还是说直接调用构造函数不好。
b.实际上书中所说不能用构造函数创建此对象,但用户还是可以用你定义的静态方法来完成这个功能;本人理解的是这是一种"约定",即如果类的创建者不公开构造函数的话,客户程序员就不要创建这个类的对象了,即也不要调用其静态方法来创建对象。
c.此种做法的特殊用途:比如统计该类的对象的个数,例如需要限制线程数目时 可以这样做。
hxy1982 2004-01-11
  • 打赏
  • 举报
回复
up
JCC0128 2004-01-11
  • 打赏
  • 举报
回复
tij3中解释为:(我看不懂,哎)
"这样就能保证,你不会一不小心就把这个方法移到package的其它地方,从而造成你自己都不能删除或修改的尴尬了。方法设成private后,这项权利就被保留下来。"

=====
"从而造成你自己都不能删除或修改的尴尬了。"能举个例子吗,针对这种情况。。。。
JCC0128 2004-01-11
  • 打赏
  • 举报
回复
谢谢wobelisk跟Gigle的回答!不过还有些困惑!

1.该类好像可以有多个实例!么很有几个网友都认为这属于singleton模式?
2.对于继承,该类真不能继承吗?嗯,好像静态方法是非面向对象的,试试

3.对于这两句话仍不理解
"prevent a class from being explicitly instantiated by users of the class"
"这样可以只有它自己可以实例化类,"
。。。。我还是有我原来的想法,是不是有点钻牛角尖了???

"但用户还是可以用你定义的静态方法来完成这个功能",
xianliti 2004-01-11
  • 打赏
  • 举报
回复
study
study
Gigle 2004-01-11
  • 打赏
  • 举报
回复
wobelisk说得对,这样可以只有它自己可以实例化类,而且不能被继承;

还有就是静态方法的作用是保证这个类只有一个实例。

如果你需要整个程序只有一个实例的情况:比如打印机等,就可以使用这种方式定义类。

62,614

社区成员

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

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