Java(和Android) - 弱属性设置器属性

时间:2013-11-16 18:12:10

标签: java properties

在Objective-C中,任何属性都可以具有弱属性,这意味着它不拥有传递的对象。如果此对象变为nil(或者在Java中为null),则此属性也将为nil(或null)。此属性所在的对象不拥有传递的对象

现在用Java,我该怎么做?

更新

为了更清楚,这是究竟发生了什么。这是一款Android应用。我有一个Fragment-A(在Activity-A里面)。 Fragment-A将自身传递给对象-B(属性名称是请求者。我用它来跟踪对象-B的调用方式)。稍后,当用户按下Activity-A时,我删除了Object-B。但是,我收到“ android - 无法销毁活动java.lang.NullPointerException ”。

我怀疑这是一个弱引用问题。这就是我问我问题的原因。

更新2: 崩溃与弱参考无关。但是,很高兴知道如何实施,我做到了。谢谢你的所有答案。

3 个答案:

答案 0 :(得分:2)

我认为你会发现http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html很有用。

WeakReference<Object> ref = new WeakReference<Object>(new Object());
...
Object newRef = ref.get();
if ( newRef == null ) {
    //Use newRef reference to Object as needed
} else {
    //Object has been released by the GC
}

答案 1 :(得分:2)

在Java中,您可以使用WeakReference。 例如:

WeakReference<Integer> myWeakInt = new WeakReference<Integer>(5);

摘自文件:

  

假设垃圾收集器确定某个点   一个对象弱可达的时间。那时它会   原子地清除对该对象的所有弱引用以及所有弱对象   引用任何其他弱可达对象   可以通过一系列强大的软引用来访问对象。在   同时它将宣布以前所有的弱可达性   对象可以最终确定。在同一时间或稍晚时间   将那些已注册的新清除的弱引用排入队列   参考队列。

您可以在官方文档中阅读更多有关弱引用的内容,但我认为this文章可以更好地用更少的词语来表达。

答案 2 :(得分:0)

在Java中,您不需要知道内存管理的所有权,因为它有一个可靠的gabage集合,也可以处理循环引用。

如果您计划在序列化的上下文中使用它,您会发现Java的WeakReference不是Serializable,并且Java的序列化机制不如Objective-C先进。它没有弱序列化引用的概念,它们不会触发自己的序列化,但如果被引用的对象由于来自其他地方的强引用而仍然被序列化,则它仍然有效。在Java中,您只能在这些情况下生成引用transient,这意味着它永远不会被序列化并且也不会被还原,然后您需要通过实现readObject方法手动恢复引用,这需要您知道关于对象的替代访问路径。令人遗憾的是,它比Objective-C更加繁琐。