在android.os.Message中,有很多字段供另一个线程识别收到消息后要做什么。
public int what;
public int arg1;
public int arg2;
但是,如果我们在将消息放入消息队列后更改字段中的值,则会影响接收线程处理消息的方式。
为什么 Android 团队不让 android.os.Message 不可变? 我认为这将防止Android开发人员犯错误。
让它不可变不是更好的设计吗?
在android.os.Message中,有很多字段供另一个线程识别收到消息后要做什么。
public int what;
public int arg1;
public int arg2;
但是,如果我们在将消息放入消息队列后更改字段中的值,则会影响接收线程处理消息的方式。
为什么 Android 团队不让 android.os.Message 不可变? 我认为这将防止Android开发人员犯错误。
让它不可变不是更好的设计吗?
我对第一个问题没有确切的答案(只有 android 团队有一个)。看起来,它与一些内存/性能考虑有关。一般来说,对象的创建非常昂贵,因此,Android建议:
获得其中之一的最佳方法是调用 Message.obtain() 或 Handler.obtainMessage() 方法之一,这将从回收对象池中提取它们。
如果您遵循 android 参考并使用 Message.obtain(),您将不会花费时间和内存来创建新的 Message 对象,而是会重新使用“消息查询”中的现有对象。我相信 Message 是可变的,因为 Android 适用于资源受限的移动系统(不确定今天是否有效,但这是几年前的事了)。
同时不可变对象有很多优点。查看 Effective Java Item 15: Minimize mutability 了解更多细节。使用不可变类的主要原因是:
有效的 Java 只提到了不可变类的一个缺点:它们需要为每个不同的值使用单独的对象。