class A
{
A getA()
{
return new A();
}
}

解决方案 »

  1.   

    如果仅仅是这样子的话,那就是做秀。你可以去研究一下singleton模式。
      

  2.   

    同意楼上这个getA方法没有任何意义
      

  3.   

    有意义的。class A
    {
    private A(){}// 将构造器变为私有。
    A getA()
    {
    return new A();
    }
    }
    那么想要声明一个A就只能调用getA().
      

  4.   

    在这个类以外声明A时。使用A a = new A()是非法的。
      

  5.   

    回复人:hzalan() ( 一级(初级)) 信誉:100  2007-09-07 10:37:06  得分:0

    有意义的。class A
    {
    private A(){}// 将构造器变为私有。
    A getA()
    {
    return new A();
    }
    }
    那么想要声明一个A就只能调用getA().----------------那你给讲讲,为什么要让人家只能用getA()?
      

  6.   

    class A
    {
    private A(){}// 将构造器变为私有。
    A getA()
    {
    return new A();
    }
    }
    那么想要声明一个A就只能调用getA().----------------那你给讲讲,为什么要让人家只能用getA()?===============================================这个类没有构造了,外面怎么样才能调用 getA() 呢?又不是静态方法!
      

  7.   

     回复人:hzalan() ( 一级(初级)) 信誉:100  2007-09-07 10:54:31  得分:0

    控制创建对象,防止直接访问构造器----------------说话别说半截,为什么不要人家直接访问构造器???
      

  8.   


    class A
    {
    private A(){}// 将构造器变为私有。
    static A getA()
    {
    return new A();
    }
    }
    那么想要声明一个A就只能调用getA()
      

  9.   

    Bruce Eckel说的,我前面刚看到,就搬上来了,,,
      

  10.   

     回复人:hzalan() ( 一级(初级)) 信誉:100  2007-09-07 10:57:45  得分:0

    Bruce Eckel说的,我前面刚看到,就搬上来了,,,------------------那你理解了么?你知道为什么要这样用么?
    如果知道怎么回事了,再回过头看看我的第一个回帖。
      

  11.   

    如果使用的是 Singleton 的话,好像还少了点什么东西public A {
      private A() {}
      private static A a;  public static getInstance() {
        if(a == null) {
          a = new A();
        }
        return a;
      }
    }
      

  12.   

    回复人: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;
      }
    }
    -------------千万别这样用,这是个陷阱。
      

  13.   

    单例模式的要static,否则,用实例返回实例? 改个名字写个clone方法吧
      

  14.   

    回复人:flyforlove(吾将远去) ( 一星(中级))麻烦给讲解一下为什么是陷阱,
    这样写有什么不妥吗?
      

  15.   

    回复人: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;
      }
    }
      

  16.   

    知道了多谢 flyforlove(吾将远去)
      

  17.   

    public A {
      private A() {}
      private static A a;  public static getInstance() {
        if(a == null) {
          a = new A(); //当多个线程同时到达这个地方的时候。
        }
        return a;
      }
    }能不能将 getInstance() 方法修改成 synchronized 的??
      

  18.   

    flyforlove(吾将远去) 的做法难道没有问题?多线程情况下,乖乖的这样用吧。
    public A {
      private A() {}
      private static A a = new A();  public static getInstance() {
        return a;
      }
    }这个在多class loader的情况下,还是会有问题,
    可以使用double-checking
      

  19.   

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

  20.   

    回复人: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,也不安全。
      

  21.   

    如果仅仅是这样子的话,意义不大,或者说基本没有什么意义。
    顺便说下singleton模式的基本条件:
    1.构造函数是私有的,意味着外界不能直接通过new的方式来创建该类的实例。
    2.该类必须自己创建自身的唯一实例。
    3.该类必须向外界提供访问唯一实例的接口。
      

  22.   

    ...

    在这个类以外声明A时。使用A a = new A()是非法的。
    ----------------------------------------------
    我试了一下,调用完全合法
    ----------------------------------------------private了。怎么调后面在说点什么是看不懂了,拜拜各位大虾
      

  23.   

    多线程情况下,乖乖的这样用吧。
    public A {
      private A() {}
      private static A a = new A();  public static getInstance() {
        return a;
      }
    }=======================================我不认为这样比较好,因为总有办法让 a 为 null 的。只要 a 为 null,那整个就没办法用了。
      

  24.   

    回复人:bao110908(火龙果) ( 五级(中级)) 信誉:100  2007-09-07 12:32:22  得分:0

    多线程情况下,乖乖的这样用吧。
    public A {
      private A() {}
      private static A a = new A();  public static getInstance() {
        return a;
      }
    }=======================================我不认为这样比较好,因为总有办法让 a 为 null 的。只要 a 为 null,那整个就没办法用了。
    ----------
    说说你的办法。
      

  25.   

    flyforlove(吾将远去) 的做法难道没有问题?多线程情况下,乖乖的这样用吧。
    public A {
      private A() {}
      private static A a = new A();  public static getInstance() {
        return a;
      }
    }这个在多class loader的情况下,还是会有问题,
    可以使用double-checking===========================================================
    改一下:
    private static A a = null;public synchronized static getInstance() {
        if(a == null){
            a = new A();
        }
      return a;
    }这样会解决多线程问题
      

  26.   

    StringBuffer    /**
         * @see     java.lang.String#valueOf(java.lang.Object)
         * @see     #append(java.lang.String)
         */
        public synchronized StringBuffer append(Object obj) {
    super.append(String.valueOf(obj));
            return this;
        }StringBuilder JDK 1.5 added     /**
         * @see     java.lang.String#valueOf(java.lang.Object)
         * @see     #append(java.lang.String)
         */
        public StringBuilder append(Object obj) {
    return append(String.valueOf(obj));
        }
      

  27.   

    StringBuilder JDK 1.5 added     public StringBuilder append(String str) {
    super.append(str);
            return this;
        }
      

  28.   

    回复人:flyforlove(吾将远去) ( 一星(中级))多线程情况下,乖乖的这样用吧。
    public A {
      private A() {}
      private static A a = new A();  public static getInstance() {
        return a;
      }
    }================================================上面用if(a==null)写的单例,是存在线程资源竞争的问题。但你这样写的单例还是存在缺陷的,也有比上面写法来的不好的地方:第一种单例写法能保证在getInstance()的时候,对象才会被创建,构造器内的代码才会被执行。而你的写法(大多数人的写法),对象创建是饥饿的,在ClassLoader加载类的时候就会创建。试想一下,在A的构造器里面需要用到一个参数static arg1,然后有个方法static setArg1(string)。当用户执行如下代码的时候将不会得到他想要的结果:
    A.setArg1(arg);
    A.getInstance();最好的单例写法是既没有线程竞争问题,对象创建方式又是Lazy的,参考一下我平时使用的Singletonpublic class Singleton {
        private Singleton() {};    private static class SingletonHolder {
            public final static Singleton instance = new Singleton();
        }    public Singleton getInstance() {
            return SingletonHolder.instance;
        }
    }
      

  29.   

    最好的单例写法是既没有线程竞争问题,对象创建方式又是Lazy的,参考一下我平时使用的Singletonpublic class Singleton {
    private Singleton() {};private static class SingletonHolder {
    public final static Singleton instance = new Singleton();
    }public Singleton getInstance() {
    return SingletonHolder.instance;
    }
    }-------------------这个写法是谁写的?Bob Lee?
    不过说起来,这个方法有脱裤子放屁之嫌,Singleton的作用就是拿到实例后使用,不会掺杂太多的东西。
    如果你的Singleton需要这样调用
    A.setArg1(arg);
    A.getInstance();那你应该检讨一下自己的设计了。
      

  30.   

    如果你的Singleton需要这样调用
    A.setArg1(arg);
    A.getInstance();那你应该检讨一下自己的设计了。======================================
    Shark.config(propertiesFile);  //load shark configute file for engine
    Shark instance = Shark.getInstance(); 呵呵,无论你觉得这种使用方式好不好,但是不可否认这样写还是很常见的。自己代码不敢献丑了,我做工作流的,就随便摘一段Shark的源码供你参考。难道你不认为最后一种单例会更好一点?这些小的细节,能尽量写的完美一些不是更好么?比起原来的写法不只多了2、3行代码,不能说是“脱裤子放屁之嫌”
      

  31.   

    Shark.config(propertiesFile); //load shark configute file for engine
    Shark instance = Shark.getInstance(); ----------------你是怎么保证多线程安全的????
      

  32.   

    你是怎么保证多线程安全的????============================
    Shark引擎只随服务启动一次,既:Shark.config(propertiesFile); //load shark configute file for engine
    Shark instance = Shark.getInstance(); 这样的代码只在服务启动的时候执行一次,后面存在并发的时候只会有: Shark instance = Shark.getInstance(); 我们的讨论似乎跑题了,水了楼主的帖子@_@
      

  33.   

    回复人:IcyFenix(http://www.fenixsoft.net/) ( 一级(初级)) 信誉:100  2007-09-07 17:47:08  得分:0

    你是怎么保证多线程安全的????============================
    Shark引擎只随服务启动一次,既:Shark.config(propertiesFile); //load shark configute file for engine
    Shark instance = Shark.getInstance();这样的代码只在服务启动的时候执行一次,后面存在并发的时候只会有:Shark instance = Shark.getInstance();我们的讨论似乎跑题了,水了楼主的帖子@_@---------------------如果是这样的话,使用上面你所述的方法就更加没有意义了,你只要使用个最简单的实现就可以了。
    因为
    你不用考虑多线程初始化问题。
      

  34.   

    好巧啊,我的一个同学今天刚刚问了这个问题。本人向她解释了半天她没听懂。
    现在好了,有这么多的解释。让她自己来看好了。
    我同意楼上一位的观点:有意义的。class A
    {
    private A(){}// 将构造器变为私有。
    A getA()
    {
    return new A();
    }
    }
    那么想要声明一个A就只能调用getA().
      

  35.   

    class A
    {
    private A(){}// 将构造器变为私有。
    A getA()
    {
    return new A();
    }
    }
    那么想要声明一个A就只能调用getA().
    ____________________________________不好意思,我想问一下,照这样写 getA() 这个方法在外部怎样才能调用呢?
      

  36.   

    ...在这个类以外声明A时。使用A a = new A()是非法的。
    ----------------------------------------------
    我试了一下,调用完全合法
    ----------------------------------------------private了。怎么调后面在说点什么是看不懂了,拜拜各位大虾
    ----------------------------------------------
    lz的代码中那有private?在ide里编译一下就知道了
      

  37.   

    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下属公司)
      

  38.   

    回复人: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公司在用,它还是有缺陷。