I've been reading a bit about Singleton pattern usage in Android and its disadvantages regarding to keeping the Context. In fact, when I implement the following code:
private static HttpManager sSingleton;
private Context mContext;
private HttpManager(Context context) {
mContext = context;
}
public static synchronized HttpManager getInstance(Context context) {
if (sSingleton == null) {
sSingleton = new HttpManager(context);
}
return sSingleton;
}
Android Studio shows me the following warning:
Do not place Android context classes in static fields (static reference to HttpManager which has field mContext pointing to Context); this is a memory leak and also breaks Instant Run.
However, I can see Singletons implemented and recommended in this page of Android's docs.
If your application makes constant use of the network, it's probably most efficient to set up a single instance of RequestQueue that will last the lifetime of your app. You can achieve this in various ways. The recommended approach is to implement a singleton class that encapsulates RequestQueue and other Volley functionality.
Since Google is contradicting itself, can someone guide me and advise me on this point?
The most important drawback of the singleton pattern is sacrificing transparency for convenience. Consider the earlier example. Over time, you lose track of the objects that access the user object and, more importantly, the objects that modify its properties.
Singletons hinder unit testing: A Singleton might cause issues for writing testable code if the object and the methods associated with it are so tightly coupled that it becomes impossible to test without writing a fully-functional class dedicated to the Singleton.
Some consequences of the Singleton pattern include controlling access, permitting subclassing, and enhancing flexibility.
Prevent Singleton Pattern From Cloning To overcome the above issue, we need to implement/override the clone() method and throw an exception CloneNotSupportedException from the clone method. If anyone tries to create a clone object of Singleton , it will throw an exception, as shown in the below code.
Since Google is contradicting itself
No, it is not.
The quoted Lint warning is not complaining about creating singletons. It is complaining about creating singletons holding a reference to an arbitrary Context
, as that could be something like an Activity
. Hopefully, by changing mContext = context
to mContext = context.getApplicationContext()
, you will get rid of that warning (though it is possible that this still breaks Instant Run — I cannot really comment on that).
Creating singletons is fine, so long as you do so very carefully, to avoid memory leaks (e.g., holding an indefinite static
reference to an Activity
).
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