我在很多地方看到过编写接口的好处,我完全同意。例如,能够编写List接口,而不必考虑底层实现,肯定有助于解耦和测试。对于集合,我可以看出ArrayList和LinkedList在不同情况下都适用,因为它们在内部存储结构、随机访问时间等方面存在差异。然而,这两种实现可以在同一个接口下使用...这很棒。
我无法理解的是某些同步实现(特别是Hashtable和Vector)如何与这些接口相适应。对我来说,它们似乎不符合模型。大多数底层数据结构实现似乎在数据存储方式上存在差异(LinkedList、Array、排序树等),而同步处理的是数据访问时的条件(锁定条件)。让我们看一个返回Map集合的示例:
public Map<String, String> getSomeData();
假设应用程序完全不关心并发性。在这种情况下,我们通过接口操作方法返回的任何实现...每个人都很高兴。世界是稳定的。
但是,如果应用程序现在需要关注并发性呢?我们现在无法忽略底层实现而进行操作 - Hashtable 可以,但必须为其他实现提供服务。让我们考虑3种情况:
1)在使用集合添加/删除时使用同步块等强制同步。然而,在返回同步实现(Hashtable)的情况下,这是否过度了呢?
2)更改方法签名以返回Hashtable。然而,这将紧密绑定到Hashtable实现,因此,编程到接口的优势被抛到了窗外。
3)利用并发包并更改方法签名以返回ConcurrentMap接口的实现。对我来说,这似乎是前进的方向。
基本上,似乎某些同步实现在集合框架中有点不适合,因为在编程到接口时,同步问题几乎迫使人们考虑底层实现。
我完全错过了重点吗?
谢谢。
synchronized
关键字并不能使您的程序线程安全。即使使用java.util.concurrent
集合,您也希望将它们保持为私有实现细节。 - Tom Hawtin - tackline