java - WeakReference<> 在这种特定情况下是否有助于 GC?
问题描述
我不确定从长远来看这是否会给我带来一些内存泄漏问题,我想知道在这种情况下使用弱引用是否有什么不同:
public abstract class ChangeObserver<X extends SomeClass> {
X someClass;
public ChangeObserver(X someClass) {
this.someClass= someClass;
}
public void notifySomeClass(
) {
onChanged().onChanged(someClass);
}
public abstract OnDataChanged<X> onChanged();
@FunctionalInterface
public interface OnDataChanged<X> {
void onChanged(X x);
}
}
这会在程序的生命周期中引起问题吗?它会通过使用弱引用来解决吗?
感谢@Hulk 和@tashkhisi,我提供了这个解决方案,如果有什么遗漏,请不要犹豫,纠正它。
public abstract class ChangeObserver<X extends SomeClass> {
private WeakReference<X> someClassWeakRef;
private OnDataChanged<X> observer;
public ChangeObserver(X someClass) {
this.someClassWeakRef = new WeakReference<>(someClass);
observer = onChanged();
}
public void notifySomeClass(
) {
observer.onChanged(someClassWeakRef.get());
}
public abstract OnDataChanged<X> onChanged();
@FunctionalInterface
public interface OnDataChanged<X> {
void onChanged(X x);
}
}
我仍然缺少的是这个 removeObserver() 方法究竟应该做什么来删除观察者,如果我要使用避免内存泄漏的特定方法,它只是简单地设置观察者 = null 吗?
提前致谢。
解决方案
是的,有很多方法可以Observer
在 Java 中解决 Pattern 中的内存泄漏,其中一种是在您的类中添加另一种方法,以便在您不再需要它们时removeObserver
删除 Observer 对象,第二种方法是使用弱引用,如下所示Observable
:(我宁愿命名它someObject
而不是someClass
但我遵守了你的命名约定)
WeakReference<X> x = new WeakReference<X>(someClass);
推荐阅读
- node.js - 有没有办法在 RichEmbed 中嵌入超链接?
- php - 用户代理正在等待每个 http 查询的最大保活超时
- javascript - 对象值未更新且不知道为什么
- firebase - AndroidX 迁移后 Firestore 损坏
- latex - 在 R Markdown 中创建备忘录
- r - 整理“基准”列
- c# - 打开 Id Connect 重定向问题 .Net Core 2.2
- daml - Main.daml 中的语法错误
- angular - 下载文件时如何传递身份验证令牌?
- sql-server - 使用 Visual Studio 中的报表服务器项目向导 (SSDT) 对每个数据库运行查询