The debate about Singleton vs Static is quite old and it is still continuing and there are lots of confusion around this as well. In this post, I am trying to explain these two concepts, key differences and its usages.In this post I will not focus on the basics of Static and Singleton and how to write that. If you are new to these keywords, I will advise you to learn about these first to get more benefited.
So first we are going to understand the characteristics of each . Lets start with static class
Static Class :
- Static classes cannot be instantiated so it restricts us in many ways like it cannot implement Interfaces, inherit any class etc.
- Any other scenarios where this keyword is required, it cannot be used like indexer etc. Also it cannot be used as method parameter, local variable etc for the same reason.
- Static classes can have only static members – constructor, fields, methods, properties, events.
- One cannot control when static constructors are called. It’s always earlier than first access of the class. So no parameters can be passed as well.
Internally when compiler compiles static class, it marks it as a abstract and sealed. So that no instance can be created and cannot be extended as well. Now let’s talk about Singleton
Singleton Class :
- As name suggests it allows to have only one instance of a class.
- The constructor of this class are marked as private so that accidentally one cannot create multiple instances and provides a static function/property which first create one instance and returns the same each time.
- As singleton is a normal class, it allows us to leverage all that features of object oriented programming concepts.
Memory Management :
There is much confusion around memory management of static class and Singleton class. In simple words, any class whether it is itself static or any member if marked as static then it would not be collected by Garbage Collector.
Static variables/classes are not stored in normal Heap and there is a separate space in memory to store static resources which holds the static classes and variables.This space is beyond the scope of GC and memory get release only when corresponding process/AppDomain unloads.
Because singleton holds a static reference which cannot be collected by GC so the instance cannot be collected and both (Static and Singleton) gets destroyed with the AppDomain/Process.
Some Key common characteristics :
- As both of the static and singleton instances are have just one copy in memory throughout the whole application, both used for holding global state in an application.
- Both are initialized lazily, it means for static classes it is initialized only when accessed first time and for Singleton, it gets created only when it is accessed first time.
- Very first difference is that Static is a language feature and Singleton is a architectural pattern so both belongs to difference arena altogether.
- Now a days everybody is behind using Dependency Injection and Static does not fit there because it is interface driven.
- Unit Testing is another topic where you can find some way to create a mock for singleton instances but testing static is a nightmare.
- Being singleton is a just another class, it enable you to use Object oriented concepts.
Singleton approach is much more flexible as we can see that from the differences itself. We can use interface with it and implement it in a class and use in our application. If some requirement changes and later we require to change the logic then we can just remove the older implementation and replace with new one without hiccups as long as the interface is same.. Also testing is another key benefit.
Static classes is mainly recommended for having grouping of a bunch of utility methods that can be called independently but again testing could be a problem and benefits of OOP is gone. So most of the time static should be avoided.
Having said that using global variable (like static class or singleton) makes a strong coupling between the global data and all the places where it is used.