我正在创建一个WeakReference
并将其保存在某个位置。
WeakReference<MySpecialObject> mWeakReference = new WeakReference<MySpecialObject>(new MySpecialObject("My","Special","Data"));
但其他一些外部库(我不知道它在做什么)确实需要MySpecialObject
实例。当我使用下面类似的东西时:
ExternalLibraryThingy#useItWisely(mWeakReference.get());
第1部分结束
过了一段时间我会打电话给
ExternalLibraryThingy#doSomethingUsefull(); //which I dont know it kept a reference while calling "useItWisely" method.
第2部分结束
问题
在第1部分结束之前,我在本地创建的MySpecialObject
对象是否仍被弱引用?我的意思是,如果我打电话给mWeakReference.get()
,有机会得到null
吗?换句话说,操作系统可以随意进行垃圾收集吗?
直到第2部分结束,如果ExternalLibraryThingy
在useItWisely
时进行和赋值,并在doSomethingUsefull
时使用该赋值,它能抛出NullPointerException
吗?
我想一个简单的答案可以同时回答这两个问题。提前谢谢。
您将取消引用的对象传递给ExternalLibraryThingy#useItWisely
方法。外部库不关心您是否从弱引用中检索到对象。
因此,该对象在外部库中是否具有强引用完全取决于您对其调用的方法。如果不知道该方法的作用,就不可能知道该对象是否仍将被引用。
至于你的第二个问题,图书馆直接有MySpecialObject
参考资料。从外部库的角度来看,它不会被null
随机替换。