I know SO pals are not fans of "versus" questions but... even rephrasing the tittle a bit, the versus part is still there, so, why hide it.
Basically, I'd like to know when and why should I use a singleton or a static class, what can offer a singleton that a static class cant, and vice versa.
For a long time I used both, and I cant see a reason why I shouldn't use one over the other.
Thanks.
A Singleton can implement interfaces, inherit from other classes and allow inheritance. While a static class cannot inherit their instance members. So Singleton is more flexible than static classes and can maintain state. A Singleton can be initialized lazily or asynchronously and loaded automatically by the .
While a static class is generally initialized when it is first loaded and it will lead to potential class loader issues. Singleton Objects stored on heap while static class stored in stack. Singleton Objects can have constructor while Static Class cannot.
The Singleton class does not require you to use the static keyword everywhere. Static class objects cannot be passed as parameters to other methods whereas we can pass instances of a singleton as a parameter to another method.
In C#, it is possible to implement interfaces, inherit from other classes and allow inheritance with the Singleton class. These are not possible with a static class. So the Singleton class is more flexible as compared to static classes.
Both are basically global variables with caveats. Static classes prevent inheritance, and Singletons are ugly and add overhead with a property lookup. Both make automated testing difficult.
AS3 supports global variables, so why not use those?
Static:
package com.example
{
public class Config
{
public static var VERSION:uint = 1;
}
}
Singletons:
package com.example
{
public class Config
{
public static var instance:Config = new Config();
public var version:uint = 1;
public function Config()
{
//Boiler plate preventing multiple instances
}
}
}
Global variable:
package com.example
{
public var config:Config = new Config();
}
class Config
{
public var version:uint = 1;
}
Now, let's say even though you only want a single instance of the class in your production app, you need multiple instances to write tests. You can make a public class Config
, and use com.example.config = new Config()
to reset. All the places that reference your global variable are now using the new instance, and you can even do fancy things like inheritence.
For example:
if(inDebugMode)
{
com.example.config = new DebugConfig();
}
{
com.example.config = new Config();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With