我有一个扩展我的User对象的静态单例类:
public class TestSingleton extends User{
private static TestSingleton singletonInstance;
private TestSingleton() {
}
public static TestSingleton getObj() {
if (singletonInstance == null) {
singletonInstance = new TestSingleton();
}
return singletonInstance;
}
}
单例的目的是避免在我想在不同的活动中使用我的User对象时创建新实例:
TestSingleton test = new TestSingleton();
test.doSomthing();
并在一行中编写它并在我的应用程序生命周期中只创建一次实例:
TestSingleton.getObj().doSomthing();
我的问题是:
使用静态Singleton是否会造成内存泄漏并保持对我使用单例的任何活动的引用?
使用安全吗?还是有更好的解决方案?
答案 0 :(得分:1)
这种静态Singleton的使用是否会造成内存泄漏并保持引用 对于我使用单身人士的任何活动?
它在99.9%的案例中不胜一筹,
Is it safe to use?
这取决于您的安全意味着什么。例如,您的实现不是线程安全的。如果从两个不同的线程调用getObj(),则可能会发生两次实例化TestSingleton。
or there is a better solution?
使用Enum的Singleton模式的实现。您可以在Effective Java上找到一个示例
答案 1 :(得分:0)
如果只需要User
的一个实例,则无需扩展它。您在TestSingleton
中所做的只是在User
课程中完成。
例如:
public class User{
private static User singletonInstance;
private User() {
}
public static User getObj() {
if (singletonInstance == null) {
singletonInstance = new User();
}
return singletonInstance;
}
}
<强>更新强>
用于线程安全使用
public synchronized static User getObj() {
if (singletonInstance == null) {
singletonInstance = new User();
}
return singletonInstance;
}
我认为在这种方法中你不需要考虑内存泄漏。
答案 2 :(得分:0)
A memory leak may happen when an object is stored in memory but cannot be accessed by the running code
对于单身人士,只创建了一个对象。并且它仅在首次使用时创建。没有内存泄漏。 只有当您想要使用多线程时,才必须同步instance(),以便只创建一次对象。
并且99.99%确定不会有任何内存泄漏
答案 3 :(得分:0)
是的,单身人士可能会导致内存泄漏,请阅读以下文章:https://stackoverflow.com/a/13891253/1028256
在Android生命周期中,可能会重新创建活动,并且您的单例可能会保留对旧活动实例的引用,从而防止它被垃圾回收。这意味着如果你保留这样的引用,你应该在单例中使它们在Activity.onDestroy()上取消它们
仅供参考,当应用程序被销毁时,单身人士也可能被销毁,因此您无法依赖它。
可能您需要考虑将数据持久保存在应用程序存储中或Application对象中。