正在研读Joshua Bloch的《Effective Java》一书。书中至少在两条中提到了“优先使用接口而不是类”,一是第25条中的“参数类型优先使用接口而不是类”;另一个是第34条中的“通过接口引用对象”。
两条中所提及的例子一个是Map,一个是List(因为此书的作者就是Collection Framwork的作者)
Map ht = new Hashtable();
String value= doSomething(ht);
private String doSomething(Map pram) {
.....
// 比如这里需要 pram.clone(); 该怎么办呢?
Map pram2 = pram.clone(); // 会出错的,因为Map接口中没有clone方法,那是Cloneable接口中的
}
书上说“没有理由在编写一个方法时使用Hashtable作为输入,相反,应该使用Map”。
但是我想问的是:一个类可能实现多个接口,如果不同接口中所定义的方法,都要用到,那么该选择哪个接口作为“代表”呢?恐怕哪个都是片面的。比如,如果我要在方法对传入的参数做clone操作,那么就必须使用Hashtable作为参数了,因为它还实现了Cloneable接口。
可以说这种时候,就是一个充分的理由,使用类(Hashtable)来声明了吗??
分享到:
相关推荐
4. **组合优于继承**:在设计时,优先考虑对象组合(组合复用),而不是过多地使用继承,以避免类层次过深导致的问题。 总之,抽象类和接口都是C#中实现抽象和多态的重要手段,它们各有优势,适用于不同的场景。在...
因此,在选择使用接口还是抽象类时,应考虑是否需要共享具体实现以及类层次结构的复杂程度。 2. **面向接口编程与面向对象编程的关系**:面向接口编程不是一种独立于面向对象编程之外的全新编程范式,而是面向对象...
- 接口主要用于定义对象的行为规范,强调“做什么”而不是“怎么做”。 #### 四、总结 虽然抽象类和接口都能实现多态性和抽象性,但它们各自适用于不同的场景。选择使用抽象类还是接口取决于设计的需求。当需要...
虽然优先队列不是线程安全的,但你可以使用迭代器安全地遍历队列中的元素: ```java Iterator<Integer> iterator = queue.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } ...
4. **自定义类**:像"priority_queue_1.0"这样的库可能就是通过创建自定义的MATLAB类来封装这些操作,提供一个简洁的接口供用户使用。 在"priority_queue_1.0"这个压缩包中,可能包含了实现上述功能的MATLAB源代码...
- **优先考虑组合而非继承**:通过组合其他类的对象来实现功能,而不是继承。例如,可以用一个`Motor`对象组合到`Car`类中,而不是让`Car`继承`Motor`。 - **使用策略模式**:当行为的改变不涉及类的基本性质时,...
在具体实现过程中,可以使用`java.util.Queue`接口的实现,如`LinkedList`,来实现队列操作,而`HashMap`则提供了高效的键值对存储和查找功能。此外,还需要考虑优化哈希表的冲突处理策略,以提高查找效率。 【文件...
这些接口不是教程性质的文档,而是提供了一种精确的参考手册,目的是帮助开发者理解如何使用 SQLite。对于初学者来说,建议首先阅读官方提供的快速入门指南和 C/C++ 接口介绍。 #### 接口分类 SQLite 接口根据稳定...
而方法覆盖是子类对父类已有方法的重新定义,当子类对象调用同名方法时,会优先执行子类的方法,而不是父类的。这使得子类可以在不改变父类原有行为的基础上扩展功能。为了实现覆盖,方法必须满足以下条件:同名、同...
以及合成/聚合复用原则(Composite/Aggregation Reuse Principle, CARP),优先使用对象组合或聚合,而不是继承,以增强软件的灵活性和可维护性。 这些原则共同构成了面向对象设计的基础,有助于创建出更易于理解、...
15. **继承和多态**:Java支持单一继承,即一个类只能直接继承自一个父类,但可以通过接口实现多继承的特性。 选择题涉及的知识点: 1. 对象是属性和方法的封装体,不是所有对象都有继承性,如原始类型没有继承性...
成员变量的隐藏发生在子类中声明了与父类同名的变量时,子类会优先使用自己定义的变量,而隐藏父类的变量。方法重写(Override)则发生在子类提供与父类相同名称和签名的方法,以便为特定的子类行为提供不同的实现。...
在设计类结构时,应优先考虑使用组合(has-a)关系,而不是继承(is-a)。继承可能导致类层次过于复杂,而组合则更加灵活,可以更自由地组合对象的功能,同时避免了多继承带来的问题。 ### 4. 单一职责原则 (Single...
- 注意:该接口可能不是最佳选择,建议优先考虑`getCardNo()`。 7. **对IC卡加密** - 函数原型:`int EncryptICCard(QString strKey)` - 描述:用于对IC卡进行加密处理。 - 参数: - `strKey`: 加密使用的密钥...
例如,在 Java 中,可以使用接口来定义一个方法,而不是使用具体的实现类。这样,当需要改变实现时,只需要改变接口的实现,而不需要改变客户端代码。 二、优先使用组合而非继承(Favor Composition Over ...
通常建议优先考虑使用组合而不是继承,原因有几点: - **封装性**:使用组合可以更好地保持类之间的封装性,因为每个类都专注于自己的职责。 - **灵活性**:组合提供了更高的灵活性,因为可以轻松地替换或修改组件...
•一个类可以实现一个或多个接口,继承使用extends关键字,实现接口则使用implements关键字。 实现接口 •一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是...
在业务设计中,这意味着应该优先考虑在接口或抽象类中定义业务逻辑,具体的实现细节留给子类或具体的实现类去完成。这样一来,即使具体的实现发生改变,只要保持接口不变,高层模块的代码就不需要修改。 综上所述,...
4. **公平性选择**:Lock接口的实现(如`ReentrantLock`)允许开发者选择是否使用公平锁策略,公平锁可以确保线程按照请求顺序获取锁,而非公平锁则可能优先考虑已经在等待的线程。 #### 七、总结 - **...
- 在设计系统时,优先考虑接口或抽象类,而非具体实现。 - 使用接口而非实现进行参数传递和返回值,以减少耦合。 - 尽可能让类之间的关系通过构造函数或配置文件来确定,而不是硬编码。 总结起来,依赖倒转原则...