Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java singleton with inheritance

I have a set of singleton classes and I want to avoid boilerplate code. Here is what I have now:

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
    }
}

This works and there's nothing wrong with it, except that I have many subclasses of Mammal that must replicate the getInstance() method. I would prefer something like this, if possible:

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
    }
}

How do I do that?

like image 626
michelemarcon Avatar asked Jun 10 '11 15:06

michelemarcon


2 Answers

You can't since constructors are neither inherited nor overridable. The new Mammal() in your desired example creates only a Mammal, not one of its subclasses. I suggest you look at the Factory pattern, or go to something like Spring, which is intended for just this situation.

like image 198
Jim Garrison Avatar answered Sep 20 '22 11:09

Jim Garrison


You can use enum to create singletons.

public enum Mammal {
    Cat {
        // put custom fields and methods here
    }
}
like image 32
Peter Lawrey Avatar answered Sep 22 '22 11:09

Peter Lawrey