Java的Collection设计是不是不太好?( 二 )



■网友
的确不好,不过Java早期给自己挖的坑现在也改不了,所以只好这样了。如果不是这样,Scala的集合也不用完全走另一套体系。
■网友
邀请我干嘛。。。我也不知道啊我也不是专门写Java的啊
■网友
题主是在用vim写Java?
■网友
我的天!你居然邀请我答这个题!我不会啊!真的不会啊!一点都不懂的!对不起老哥!
■网友
这样的设计是不是有问题?可以说没问题,也可以说有问题
没问题因为 UnmodifiableXXX 遵守了面向接口设计原则
就像我们定义了一个 的接口
public interface Bird { void fly();} 但是我们的一个实现 鸵鸟 却不会飞, 可鸵鸟确实是鸟类, 从接口角度看这样的设计没有问题。
有问题从接口层次的角度来看也是有问题的, 以List为例
public interface List\u0026lt;E\u0026gt; extends Collection\u0026lt;E\u0026gt; {}如果顶层Collection接口不包含 add,clear,remove等写操作的话,子接口是不是就可以这样设计
// 只包含读相关方法public interface ReadOnlyList\u0026lt;E\u0026gt; extends Collection {}// 即包含读也包含写操作public interface WriteableList\u0026lt;E\u0026gt; extends ReadOnlyList\u0026lt;E\u0026gt; {} 那么Collections.unmodifiableList的返回值也设置为ReadOnlyList而不是List, 自然就不会暴露写相关方法了。
但是!
思考一下不可变就是不能进行写吗 ?明显不是, 参考Java的String, String也是不可变的,但支持符号操作符+, replace等也是写方法, 但是相关写操作保证会返回一个新的String, 从而在保证不变性的同时也支持写操作。
但是由于历史原因, 集合相关的接口方法签名肯定是没法再改了。
【Java的Collection设计是不是不太好?】


推荐阅读