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