Closed hyfink closed 7 years ago
Collections.emptyList()
只是占位和保证 NonNull 的,你不能指望它成为你的容器,既然你调用了 MutliTypeAdapter
无参的构造函数,说明你想延后设置 items
容器,因此只要你之后再设置 items
容器即可自由增删改查。否则你应该调用 MultiTypeAdapter(@NonNull List<?> items)
构造函数传入你的 empty list.
现在用法我知道了,只是觉得调用无参构造初始化一个不可用的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.
你如何使用这个默认 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()
作为默认无参构造函数的占位对象会更好,感谢你的建议,不知道能否让你理解。
懂了,之前我确实是通过MultiTypeAdapter#getItems()
获取的List<?>
,强转然后添加的 Item。我也觉得那样不算很好的做法。
所以其实你是不建议通过Adapter来维护数据List,而是自己在Adapter之外维护一个List,以便于增删查改。Adapter不负责List的数据维护,只负责List与View的绑定。
感谢解惑!🙏
你在什么情况下需要修改这个
Collections.emptyList()
的内容,据我所知不会有这样的情况。