I'm trying to create a subclass which auto creates itself. I defined Base
which holds a list of instances. Then I defined Derived
with a static member reg
. reg
is in place initialized by calling Base.Register()
, which adds it to the instances list.
In the main()
I'm printing the instances list of Base
. But there is no initialization and I get an error - the instances list is null
.
In a further attempt, I added a list of Booleans
to Base
. Whenever I register an instance, I'm changing this list. I also print this list in the program. I expected it to force the execution of the Base.register()
, but to no avail.
I did find a solution that worked, but I don't appreciate - I could print the result of the Base.register()
as saved in the Derived
. That would force the static initialization. However, I intend to use the solution for a bunch of derived classes, and I wouldn't want to have to call each derived class directly.
Is there a way to force the static init?
I guess I could use reflections, I'm trying to avoid that at the moment.
EDIT what I am actually trying to do, is to build a set of derived classes (for unit testing). All classes derive Base
. I want to avoid the need to create instances separately for each. I'm trying to get a generic solution, in each derived class code (only). Such a solution would be easy to copy & paste.
public class StaticTest {
private static class Base{
private static ArrayList<Base> _instances = null;
private static ArrayList<Boolean> _regs = null;
public static int _count = 0;
public static void init(){
_regs = new ArrayList<>();
for (int i=0;i<10;i++)
_regs.add(false);
}
protected static boolean register(Base b)
{
if (_instances == null)
_instances = new ArrayList<>();
_regs.set(_count++, true);
return _instances.add(b);
}
public static void printAll(){
for (Boolean b: _regs)
System.out.printf("hello %s%n", b.toString());
for (Base b: _instances)
System.out.printf("hello %s%n", b.toString());
}
}
private static class Derived extends Base{
public static boolean _reg = Base.register(new Derived());
}
public static void main(String[] args) {
//System.out.print(Derived._reg ? "0" : "1");
Base.init();
System.out.printf("Base._count = %d%n",Base._count);
Base.printAll();
}
}