开发者

Static/Final java classes?

I want to force implementation of the singleton pattern on any of the extended classes of my parent class. That is, I only want one instance of every child cl开发者_Go百科ass to ever be around (accessible through Child.INSTANCE or something like this).

Ideally what I would like would be for the Child.INSTANCE object to be made, and then no other object of type Parent to be made.

Currently I get my instances through something like:

public class Child extends Parent {
    public static final Child INSTANCE = new Child();
    ....

I wonder, can a java class be made static or something in some way?

Thanks =]


Is the set of your child classes fixed? If so, consider using an enum.

public enum Parent {
    CHILD1 {
        // class definition goes here
    },

    CHILD2 {
        // class definition goes here
    };

    // common definitions go here
}

Since the OP mentioned about state pattern, here are two examples of enum-based state machines: a simple one and a complex one.


It can be done, but I don't see the point. You would be better off using an enum IMHO.

enum {
  Singleton, 
  Child { /* override methods here * }
}

However to answer you question, you could do the following

class SingletonParent {
   private static final Set<Class> classes = new CopyOnArraySet();
   { if (!classes.add(getClass()) throw new AssertionError("One "+getClass()+" already created."); }
}


You are looking at the wrong design pattern.

Take a look at the Factory pattern. A factory can create a single instance of a class and then hand it out to anyone who wants it. The factory can hand out a singleton of the parent, any child, or anything else you want.


You can use a Java enum. Basically it makes a bunch of public static classes (like you do) but puts a few restrictions on them.

public enum Child {
   INSTANCE;
}

Note that enums are full classes, so you can easily add methods on a per-instance basis if you wish.


I will answer with a question I asked a while back that was very similar. I believe that this will do what you want it to do, but comes with all the restrictions mentioned in the answers.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜