0

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

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

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

为什么 Android 团队不让 android.os.Message 不可变? 我认为这将防止Android开发人员犯错误。

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

4

1 回答 1

2

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

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

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

同时不可变对象有很多优点。查看 Effective Java Item 15: Minimize mutability 了解更多细节。使用不可变类的主要原因是:

  • 不可变对象很简单;
  • 不可变对象本质上是线程安全的;它们不需要同步;
  • 不可变对象可以自由共享,甚至可以共享它们的内部(通常是final);
  • 用不可变的对象构建其他对象更容易;

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

于 2012-06-30T12:48:28.157 回答