Re: Singleton Design pattern with a twist - n00b
eladkatz@gmail.com wrote:
Arne Vajh=F8j wrote:
eladkatz@gmail.com wrote:
Arne Vajh=F8j wrote:
I would probably use something like:
private static ConfigInfo confinfo;
public static setup(ConfigInfo cfg) {
Oops.
There are missing a void in that line.
if(instance == null) {
confinfo = cfg;
} else {
throw VeryBadException("Too late !");
}
}
thanks but the thing is - this means that whenever i get the singleton
(many places) i have to try/catch
No.
This setup method is only intended to be called once at program
startup or similar.
Then you call your getInstance method many places unchanged.
The getInstance method implementation just uses confinfo.
Arne
but what if setup was not called before getInstance - shouldnt it throw
an exception saying that the instance does not have a configInfo setup
(i.e. if confInfo == null)
Try it this way...
public class MySingleton {
private static final Object sync;
private static MySingleton instance;
public static void setup(ConfigInfo config) {
synchronize(sync) {
if (instance != null) {
throw new IllegalStateException(
"MySingleton already initialized!"
);
}
instance = new MySingleton(config);
}
}
public static MySingleton getInstance() {
if (instance == null) {
throw new IllegalStateException(
"MySingleton was not initialized!"
);
}
return instance;
}
private final ConfigInfo config;
private MySingleton(ConfigInfo config) {
this.config = config;
}
}
Since IllegalStateException is a RuntimeException, you don't need to
(and probably shouldn't) catch it. RuntimeExceptions, and Errors are
most often the result of a bug or a severe malfunction. When you get
them, you should usually just log the exception, and then perform a
clean-as-possible shutdown. Then you can use the log to figure out
what is causing it and fix the Bug.