为什么android.os.Message不是不可变的

时间:2012-06-30 11:55:12

标签: android message immutability

在android.os.Message中,有很多字段可供另一个线程识别收到消息后要做的事情。

public int what;
public int arg1; 
public int arg2;

但是,如果我们在将消息放入消息队列后更改字段中的值,则会影响接收方线程处理消息的方式。

为什么Android团队没有让android.os.Message成为不可变的? 我认为它会阻止Android开发人员犯错误。

让它不可变是不是更好的设计?

1 个答案:

答案 0 :(得分:2)

我对第一个问题没有确切的答案(只有安卓团队有一个)。看起来,它与一些内存/性能考虑因素有关。通常,对象的创建非常昂贵,因此,Android suggests

  

获取其中一个的最佳方法是调用Message.obtain()或其中一个Handler.obtainMessage()方法,这将从循环对象池中提取它们。

如果您遵循android引用并使用Message.obtain(),则不会在创建新的Message对象上花费时间和内存,而是会重新使用“消息查询”中的现有对象。我认为Message是可变的,因为Android适用于资源有限的移动系统(不确定它是否是今天的有效点,但它是在几年前)。

同时不可变对象有许多优点。查看Effective Java Item 15:最小化可变性以获取更多详细信息。使用不可变类的主要原因是:

  • 不可变对象很简单;
  • 不可变对象本质上是线程安全的;他们不需要同步;
  • 可以自由分享不可变对象,即使你可以分享他们的内部(通常是决赛);
  • 使用不可变的对象构建其他对象更容易;

有效的Java只提到了不可变类的单一缺点:它们需要为每个不同的值分别使用一个对象。