It sounds like you simply must call load() in the constructor. To ensure it is called with any constructor, call it from other constructors.
And by the way, a static initializer sounds nice, but is different, and in some cases is a bad practice. Some people believe in never using a static initializer ever, because you cannot unit test it, and in some cases you can't debug it (it is called when the class is first loaded, not when the constructor is called, or when a method is called, etc. so it depends on what version and platform you have for the JVM!)
example 1:
class MyObj {
private load() {
//private so it can't be called elsewhere by mistake (except by you in this file)
}
public MyObj() {
load();
}
public MyObj(Collection values) {
MyObj();
//next deal with values (duplicate code)
}
public MyObj( Collection keys, Collection values) {
MyObj();
//next deal with keys and values (some duplicate code)
}
...
}
example 2: (maybe more complicated causing NullPointerExceptions for new developers, but better for advanced coders because it avoids duplication)
class MyObj {
public MyObj( Collection keys, Collection values) {
load();
//next deal with keys and values (no duplication this time)
}
public MyObj(Collection values) {
MyObj(null, values);
}
public MyObj() {
MyObj(null, null);
}
...
}
If you want something more complicated, eg. a single object to exist at any time, you want to use a singleton, and possibly a factory. (A factory means a single object exists per factory rather than overall, and has other benefits not mentioned here).