2011-06-10 62 views
8

我有一组单例类,我想避免样板代码。以下是我现在有:继承的Java单例

public class Mammal { 
    protected Mammal() {} 
} 

public class Cat extends Mammal { 
    static protected Cat instance = null; 
    static public Cat getInstance() { 
     if (null == instance) { 
      instance = new Cat(); 
     } 
     return instance; 
    } 

    private Cat() { 
     // something cat-specific 
    } 
} 

这工作有什么不妥的,但我有很多Mammal子类必须复制getInstance()方法。如果可能的话,我宁愿像这样的东西:

public class Mammal { 
    protected Mammal() {} 

    static protected Mammal instance = null; 

    static public Mammal getInstance() { 
     if (null == instance) { 
      instance = new Mammal(); 
     } 
     return instance; 
    } 
} 

public class Cat extends Mammal { 
    private Cat() { 
     // something cat-specific 
    } 
} 

我该怎么做?

+1

你单身getInstance()方法是不是正确实施 - 在多线程环境中,你可以最终创建多个实例! – Liv 2011-06-10 15:58:29

+1

不是你的问题的答案,但你的单身模式不是线程安全的。有[Java并发实践]中的示例(http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601)。 – Bruno 2011-06-10 16:00:40

+0

单身真的是最好的方法吗?单身人士最好用来表示服务或其他真实世界中只有一个实例的东西。确保这种模式非常适合你的应用领域,因为我会假设你的代码并不真正使用猫和狗。如果单身人士合适,我建议使用Jim Garrison的使用Spring的解决方案;春季豆类默认为单身。 – 2011-06-10 16:56:45

回答

3

你不能因为构造函数既不被继承也不能被覆盖。你想要的例子中的new Mammal()只创建一个Mammal,而不是它的一个子类。我建议你看看工厂模式,或者去看看Spring这样的东西,它只是针对这种情况。

2

您可以使用enum来创建单身人士。

public enum Mammal { 
    Cat { 
     // put custom fields and methods here 
    } 
} 
0

使您的构造函数为私有,这将阻止您的类被其他类继承。

或者要创建一个单独的最好方法是用一个枚举创建类的枚举(乔什块)