关于单例模式的一点疑问

d_r_johnny 2011-06-19 03:53:30
public class SingletonTest {
public static void main(String[] args){
Singleton singleton=Singleton.getInstance();
Singleton singleton2=Singleton.getInstance();
System.out.println(singleton==singleton2);
Singleton singleton3=Singleton.singleton;
Singleton singleton4=Singleton.singleton;
System.out.println(singleton3==singleton4);
}

}

class Singleton{
static Singleton singleton=new Singleton();

private Singleton(){
}

public static Singleton getInstance(){
return singleton;
}
}
代码如上 在Singleton类中 对Singleton 类型的引用 进行了修改 去掉了private属性 使其成为一个静态成员变量
运行结果一样实现了 singleton3 singleton4的地址相同 指向了同一对象
那么 为什么还要写成

private static Singleton singleton=new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return singleton;
}
这种模式呢?

定义一个静态的Singleton类型的引用 singleton 那么每个对象 都拥有着唯一的静态成员变量 自然就实现了 指向唯一的实例
求解答

...全文
102 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2011-06-19
  • 打赏
  • 举报
回复
本来singleton3和singleton4就是指向同一个对象,所以使用静态能达到唯一,这点Lz理解的没问题,但是LZ没理解private的意义,private就是不让外部直接访问,避免被修改
假如某个操作
Singleton.singleton = null,singleton就被修改了,所以然大家使用的还是唯一的相同一个singleton,但是有些人不希望它改变,而某些操作却把它改变了。
如果LZ不想使用private,还有一种方法可以保护它,就是用final,即
final static Singleton singleton=new Singleton();
这样,即使暴露出来,别人也没法修改它

chenchenyangll 2011-06-19
  • 打赏
  • 举报
回复
不推荐LZ这么写

最基本的写法(不考虑并行等因素,应该是这样)
class Singleton {
private static Singleton instance = null;
private Singleton() {
// do something
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}


你那样写有个致命风险:
如果在程序中写:singleton3 = null;
所有的Singleton变量全部为null并且再没有可能初始化
  • 打赏
  • 举报
回复
接口设计。

对象的获取要通过接口获得,而不是要调用者自己new。
gyno007 2011-06-19
  • 打赏
  • 举报
回复
学习,学习!!
qybao 2011-06-19
  • 打赏
  • 举报
回复
接口,英文叫做inteface,中文是直接翻译过来的,有多个层面的理解。
你们老师告诉你的,只是一个层面的意思,也是java里很重要的一个意思
接口,可以是方法,可以是文件,可以是媒介体,等等等
也就是两个系统(或两个对象)相互访问,通信的方式,都可以称作接口
就好像CPU和主板连接的部分,我们也可以叫做接口。
这个解释起来太费劲,LZ以后在项目中慢慢体会吧。
LZ现在只需要知道,除了你们老师告诉你的意思,还有别的意思,这些意思里有微妙的相似
龙四 2011-06-19
  • 打赏
  • 举报
回复
你在哪里修改Singleton.singleton了?!
Fly_m 2011-06-19
  • 打赏
  • 举报
回复
首先private static Singleton singleton=new Singleton(); 避免让外部直接访问这个成员,只通过它提供的接口,即GetInstance去访问,这是封装的原则。

private Singleton(){
}
避免外部不通过接口访问,而是通过构造函数来构造出对象。


而且,在有些类中,构造一个对象的成本很大(比如Toolkit,Runtime类等),这种类一般不允许外部直接通过构造函数来访问,只通过接口访问。

这就是singleton模式的缘由。
chenchenyangll 2011-06-19
  • 打赏
  • 举报
回复
我以为阿宝说“接口”的意思是,提供一个获取A实例的方法\一个“窗口”\一个渠道
d_r_johnny 2011-06-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qybao 的回复:]

举个例子

Java code
class A {
private static A = new A();

private A() {
//这里的处理相当的复杂,而且很耗资源
}

public static A getA() {
return A
}
}

构造一个A很耗资源,那么如果A被new 太多,不光性能不……
[/Quote]
哦哦 我有点明白了 其实像我那么写
final static Singleton singleton=new Singleton();
然后 调用 singleton 其实是可以实现 单例的 只不过类的封装性 不建议直接对类的属性进行访问
而是更希望我们通过方法来调用是这样么?

还有 你的
public static A getA() {
return A
}
这不是一个方法么 为什么叫接口?我们老师说 接口是和类一个级别的东西
比如
interface a{
void print();
}
刚学到这里 有点迷糊
qybao 2011-06-19
  • 打赏
  • 举报
回复
举个例子

class A {
private static A = new A();

private A() {
//这里的处理相当的复杂,而且很耗资源
}

public static A getA() {
return A
}
}

构造一个A很耗资源,那么如果A被new 太多,不光性能不好,资源也大量浪费,有可能导致系统资源不足而崩溃,所以根据实际情况,只给用户提供一个公用的A,那么这个公用的A是怎么来的?当然是不能用构造函数了,否则谁都可以随意new了,所以把构造函数屏蔽,就是private,然后提同一个对外的接口,就是getA方法,通过这个接口来获得A的实例
d_r_johnny 2011-06-19
  • 打赏
  • 举报
回复
在有些类中,构造一个对象的成本很大(比如Toolkit,Runtime类等),这种类一般不允许外部直接通过构造函数来访问,只通过接口访问。 这句话怎么理解? 能举个例子么? 简单的就可以

62,614

社区成员

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

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