drakeet / MultiType

Flexible multiple types for Android RecyclerView.
Apache License 2.0
5.76k stars 751 forks source link

MutliTypeAdapter无参构造函数初始化的List(Collections.emptyList())不能修改,建议直接new List()。 #155

Closed hyfink closed 7 years ago

drakeet commented 7 years ago

你在什么情况下需要修改这个 Collections.emptyList() 的内容,据我所知不会有这样的情况。

drakeet commented 7 years ago

Collections.emptyList() 只是占位和保证 NonNull 的,你不能指望它成为你的容器,既然你调用了 MutliTypeAdapter 无参的构造函数,说明你想延后设置 items 容器,因此只要你之后再设置 items 容器即可自由增删改查。否则你应该调用 MultiTypeAdapter(@NonNull List<?> items) 构造函数传入你的 empty list.

hyfink commented 7 years ago

现在用法我知道了,只是觉得调用无参构造初始化一个不可用的EmptyList与预期不符。 一般情况下,如果我在new Adapter的时候,已经有了非空List,才会调用MultiTypeAdapter(@NonNull List<?> items)这个构造。否则使用无参构造————因为此时我只需要一个EmptyList,所以很容易会想到直接使用Adapter默认的List。

在 2017年7月16日,上午10:09,drakeet notifications@github.com 写道:

你在什么情况下需要修改这个 Collections.emptyList() 的内容,据我所知不会有这样的情况。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/drakeet/MultiType/issues/155#issuecomment-315576387, or mute the thread https://github.com/notifications/unsubscribe-auth/AHVUAW6S3YnAeF-IwFOjq3BS2CKlJLrjks5sOXDkgaJpZM4OZLRS.

drakeet commented 7 years ago

你如何使用这个默认 emptyList?使用 MultiTypeAdapter#getItems()getItems() 方法返回的是一个 List<?> 对象(有别于 List<Object>),也就是默认情况下,你无法对其 add item,除非进行强制转型。所以我不知道你实际的运用场景是什么样的。

既然没有设置构造函数的 List 参数,就不能允许其往默认 emptyList 里增加数据,因为 emptyList 就应该是 emptyList。你的预期是一种想超出规则、范围的预期,接近“越狱”或 hack 做法,可能会造成许多问题,比如你的同伴在看你的代码会很奇怪:“明明你没有配套地给 MultiTypeAdapter 设置 list,却能往其 add 数据?” 因此直观性和逻辑稳定性来说,都不如使用 Collections.emptyList()

再者,List 是一个接口,默认情况下,如果我要给用户提供一个可伸缩的 emptyList,那么我选择哪个 List 的子类合适呢?都不合适,别人都要通过阅读你源码才知道你默认给予设置了什么 List,这对用户来说是不好的,对于用户,一个库最好是提供直观的 API,稳固的逻辑规则,出现超越范围规则的内容应该 fast-fail,应该是一个黑匣子。

因此我仍然觉得 Collections.emptyList() 作为默认无参构造函数的占位对象会更好,感谢你的建议,不知道能否让你理解。

hyfink commented 7 years ago

懂了,之前我确实是通过MultiTypeAdapter#getItems()获取的List<?>,强转然后添加的 Item。我也觉得那样不算很好的做法。 所以其实你是不建议通过Adapter来维护数据List,而是自己在Adapter之外维护一个List,以便于增删查改。Adapter不负责List的数据维护,只负责List与View的绑定。

hyfink commented 7 years ago

感谢解惑!🙏