请教这种写法的用意

icedsb 2007-09-07 09:40:45
class A
{
A getA()
{
return new A();
}
}
...全文
784 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
jaymrcool 2007-09-12
  • 打赏
  • 举报
回复
dd
amazeur 2007-09-12
  • 打赏
  • 举报
回复
up
marf_cn 2007-09-12
  • 打赏
  • 举报
回复
...

在这个类以外声明A时。使用A a = new A()是非法的。
----------------------------------------------
我试了一下,调用完全合法
----------------------------------------------

。。。private了。怎么调。。。

后面在说点什么是看不懂了,拜拜各位大虾。。。
----------------------------------------------
lz的代码中那有private?在ide里编译一下就知道了
  • 打赏
  • 举报
回复
class A
{
private A(){}// 将构造器变为私有。
A getA()
{
return new A();
}
}
那么想要声明一个A就只能调用getA().
____________________________________

不好意思,我想问一下,照这样写 getA() 这个方法在外部怎样才能调用呢?
flyforlove 2007-09-12
  • 打赏
  • 举报
回复
回复人:zjf405(On№The①Road) ( 五级(中级)) 信誉:100 2007-09-12 13:02:52 得分:0
?
public class Singleton {
  private static Singleton instance = null;
  private Singleton(){}

  public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
    return instance;   
   }
}
以上是NAS公司采用的单态模式(NEC下属公司)

-------------

这种写法的缺点上面已经说了,当然不管什么代码都有其应用场合。
有缺陷就是有缺陷,就算是sun公司在用,它还是有缺陷。
zjf405 2007-09-12
  • 打赏
  • 举报
回复
public class Singleton {
  private static Singleton instance = null;
  private Singleton(){}

  public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
    return instance;   
   }
}
以上是NAS公司采用的单态模式(NEC下属公司)
zjf405 2007-09-11
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
多线程情况下,乖乖的这样用吧。
public A {
  private A() {}
  private static A a = new A();

  public static getInstance() {
    return a;
  }
}

=======================================

我不认为这样比较好,因为总有办法让 a 为 null 的。只要 a 为 null,那整个就没办法用了。
hzalan 2007-09-07
  • 打赏
  • 举报
回复
...

在这个类以外声明A时。使用A a = new A()是非法的。
----------------------------------------------
我试了一下,调用完全合法
----------------------------------------------

。。。private了。怎么调。。。

后面在说点什么是看不懂了,拜拜各位大虾。。。
左大神在这 2007-09-07
  • 打赏
  • 举报
回复
如果仅仅是这样子的话,意义不大,或者说基本没有什么意义。
顺便说下singleton模式的基本条件:
1.构造函数是私有的,意味着外界不能直接通过new的方式来创建该类的实例。
2.该类必须自己创建自身的唯一实例。
3.该类必须向外界提供访问唯一实例的接口。
flyforlove 2007-09-07
  • 打赏
  • 举报
回复
回复人:nihao955() ( 一级(初级)) 信誉:100 2007-09-07 11:47:22 得分:0
?
public A {
  private A() {}
  private static A a;

  public static getInstance() {
    if(a == null) {
      a = new A(); //当多个线程同时到达这个地方的时候。
    }
    return a;
  }
}

能不能将 getInstance() 方法修改成 synchronized 的??

----------------------------
可以,不过在多线程情况下效率比较差。


回复人:bit1010(有色心没色胆,给我一瓶二锅头!) ( 二级(初级)) 信誉:100 2007-09-07 11:48:49 得分:0
?
flyforlove(吾将远去) 的做法难道没有问题?

多线程情况下,乖乖的这样用吧。
public A {
  private A() {}
  private static A a = new A();

  public static getInstance() {
    return a;
  }
}

这个在多class loader的情况下,还是会有问题,
可以使用double-checking

------------------

那你能不能告诉我,在多class loader的情况下,还要使用singleton??
我上面说了,由于java的内存空间分配和C#不同,所以即使用dcl,也不安全。
marf_cn 2007-09-07
  • 打赏
  • 举报
回复
在这个类以外声明A时。使用A a = new A()是非法的。
----------------------------------------------
我试了一下,调用完全合法
bit1010 2007-09-07
  • 打赏
  • 举报
回复
flyforlove(吾将远去) 的做法难道没有问题?

多线程情况下,乖乖的这样用吧。
public A {
  private A() {}
  private static A a = new A();

  public static getInstance() {
    return a;
  }
}

这个在多class loader的情况下,还是会有问题,
可以使用double-checking
nihao955 2007-09-07
  • 打赏
  • 举报
回复
public A {
  private A() {}
  private static A a;

  public static getInstance() {
    if(a == null) {
      a = new A(); //当多个线程同时到达这个地方的时候。
    }
    return a;
  }
}

能不能将 getInstance() 方法修改成 synchronized 的??
wuhaozhiyuan 2007-09-07
  • 打赏
  • 举报
回复
知道了多谢 flyforlove(吾将远去)
flyforlove 2007-09-07
  • 打赏
  • 举报
回复
回复人:wuhaozhiyuan(飘) ( 二级(初级)) 信誉:100 2007-09-07 11:22:14 得分:0
?
回复人:flyforlove(吾将远去) ( 一星(中级))

麻烦给讲解一下为什么是陷阱,
这样写有什么不妥吗?

------------------

public A {
  private A() {}
  private static A a;

  public static getInstance() {
    if(a == null) {
      a = new A(); //当多个线程同时到达这个地方的时候。
    }
    return a;
  }
}

出现上述情况,会创建多个不同实例,这种lazy模式在c#里可以使用double-check,但是在java里不适用。

多线程情况下,乖乖的这样用吧。
public A {
  private A() {}
  private static A a = new A();

  public static getInstance() {
    return a;
  }
}
wuhaozhiyuan 2007-09-07
  • 打赏
  • 举报
回复
回复人:flyforlove(吾将远去) ( 一星(中级))

麻烦给讲解一下为什么是陷阱,
这样写有什么不妥吗?
malligator 2007-09-07
  • 打赏
  • 举报
回复
单例模式的要static,否则,用实例返回实例? 改个名字写个clone方法吧
flyforlove 2007-09-07
  • 打赏
  • 举报
回复
回复人:bao110908(火龙果) ( 五级(中级)) 信誉:100 2007-09-07 11:14:30 得分:0
?
如果使用的是 Singleton 的话,好像还少了点什么东西

public A {
  private A() {}
  private static A a;

  public static getInstance() {
    if(a == null) {
      a = new A();
    }
    return a;
  }
}


-------------

千万别这样用,这是个陷阱。
  • 打赏
  • 举报
回复
如果使用的是 Singleton 的话,好像还少了点什么东西

public A {
  private A() {}
  private static A a;

  public static getInstance() {
    if(a == null) {
      a = new A();
    }
    return a;
  }
}
加载更多回复(27)

62,623

社区成员

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

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