`
mazhongjia
  • 浏览: 26190 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

EffectiveJava2_Item18接口优于抽象类

阅读更多

1.java提供实现接口+继承抽象类两种方式可以用来定义允许多个实现的类型,也就是被扩展。

·采用继承抽象类的方式

缺点:会破坏类的层次结构。单继承所导致

优点:

  1)可以提供使用者(子类)实现上的帮助。我的理解就是在抽象类中提供公共方法啦、定义提公共属性啦、提供模板方法

     啦(模板方法模式实际就是利用继承机制的设计模式)、组织基础方法提供通用的更加有用的方法啦。

  2)使用抽象类来定义类型比使用接口定义类型有一个明显的优势:抽象类应对将来的变化比接口要容易的多。如果以后在

     抽象层增加新方法,抽象类始终可以增加具体的方法,并且他包含默认的实现,子类如果想提供新的行为,可以直接

     override此方法,这样做不会对不想具有此方法的子类带来影响。相反,如果采用接口作为抽象层的话,这么做显然行

     不通:如果在接口中增加新方法,会直接影响到实现该接口的所有类,导致子类无法通过编译。所以设计接口时一定要

     非常谨慎。

·采用实现接口的方式

优点:

  1)现有的类可以很容易的实现新的接口,无论类在类层次结构的什么位置,并且不会对实现接口的类的父类产生影响,只

     会对其子类产生影响。

  2)接口是定义混合类型的理想选择。混合类型我的理解就是除了类 is-a 的类型(该类的类型)之外类通过实现某一接口  

     所具有的该接口的“行为”类型。

缺点:无法像继承抽象类一样为使用者(实现接口的类)提供实现上的帮助。

2.骨架实现类

   1)引入:为了既能享受抽象类所带来的优点(上述),又能具有接口带来的好处。

   2)实现:接口用于定义类型、骨架实现类实现接口(其实就是一个实现了该类型接口的抽象类)

              ·认真研究接口,缺定哪些方法是最基本的(其他方法可以根据他们来实现),这些基本的方法为骨架实现类的

                 抽象方法,交由其子类去实现。

              ·在骨架实现类中为接口中其他方法提供具体的实现。

              ·可以根据基础方法或者接口中其他方法在骨架实现类中定义其他有用的通用方法供子类使用。

              ·如果预置的类无法扩展骨架实现类(比如该类已经存在于某一类层次结构中)则仍然可以直接去实现接口。并

                 且骨架实现类仍然能有助于这样的类去实现接口。具体方式为:实现这个接口的类在实现接口中方法时可以通

                 过包装转发机制,将方法的调用转发到一个内部私有的类的实例上,这个内部私有的类继承自骨架实现类。

   3)优点:骨架实现为抽象类提供了实现上的帮助,但又不强加“抽象类被用做类型定义时”所持有的严格限制。(除了通

               过继承手段增加功能以外别无他法)

   3)例子:先看看比较简单的骨架实现类的一个基本实现例子

定义一个通用接口

package com.gmail.mazhongjia.abstractInterface;

/**
 * 接口
 */
public interface Interface {

	void primitiveMethodA();
	
	void primitiveMethodB();
	
	void otherMethodC();
	
	void otherMethodD();
}

 

下面是骨架实现类

package com.gmail.mazhongjia.abstractInterface;

/**
 * 骨架实现类
 */
public abstract class AbstractClass implements Interface{

	//其他方法需要在骨架实现类中实现
	@Override
	public void otherMethodC() {
		//dosomething
	}

	@Override
	public void otherMethodD() {
		//dosomething
	}
	
	//其他通用方法
	public void otherMethodE(){
		primitiveMethodA();
		primitiveMethodB();
		otherMethodC();
	}
	
	//基础的方法交由子类实现
	@Override
	public abstract void primitiveMethodA();

	@Override
	public abstract void primitiveMethodB();

}

 

最后是子类

package com.gmail.mazhongjia.abstractInterface;

public class Sub extends AbstractClass implements Interface {

	//实现基础方法
	@Override
	public void primitiveMethodA() {
	}

	@Override
	public void primitiveMethodB() {
	}
}

 

再来看一个直接实现接口的例子,其中接口、骨架实现类不变

下面是子类 

package com.gmail.mazhongjia.abstractInterface;

/**
 * 外围类直接实现接口 并把对接口中方法的调用转发给PrivateClass类的实例上
 */
public class Sub2 extends OtherClass implements Interface{
	
	private PrivateClass privateClass;
	
	Sub2(){
		privateClass = new PrivateClass();
	}

	@Override
	public void otherMethodC() {
		privateClass.otherMethodC();
	}

	@Override
	public void otherMethodD() {
		privateClass.otherMethodD();
	}

	@Override
	public void primitiveMethodA() {
		privateClass.primitiveMethodA();
	}

	@Override
	public void primitiveMethodB() {
		privateClass.primitiveMethodB();
	}
	
	/**
	 * 通过内部类实现骨架实现类中基础方法(也是模拟多重继承的方式)
	 */
	private class PrivateClass extends AbstractClass{

		@Override
		public void primitiveMethodA() {
		}

		@Override
		public void primitiveMethodB() {
		}
	}
}

3.结论

·接口通常是定义允许多个实现的类型的最佳途径。除非当演变的容易性比灵活性和功能更为重要的时候。

·如果你导出了一个重要的接口,就应该坚决考虑同时为此接口提供骨架实现类。

·应该尽可能谨慎地设计所有的公有接口,并通过编写多个实现来对他们进行全面的测试。

 

0
0
分享到:
评论

相关推荐

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,该书的第三版继续提供了关于如何编写高效、优雅、可维护的Java代码的指导。以下是基于给出的目录和部分内容提取的一些关键知识点: ### 第一...

    C#接口与抽象类的详解

    2. 接口不包含继承的具体特点,只规定了调用的方法,而抽象类可能包含具体实现。 3. 类可以多重实现接口,但只能单继承(直接继承)一个抽象类或类。 4. 接口支持回调,而继承通常不支持这一特性。 5. 抽象类不能被...

    08丨理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?1

    - **Python**:Python中没有抽象类和接口的原生概念,但可以使用`abc`模块创建抽象基类(Abstract Base Class, ABC)来模拟抽象类,或者使用约定(约定优于配置)来实现接口。例如,通过定义一个没有实现的方法来...

    java_record_codes.rar_SWT_java record_java swt_java 屏幕录像

    标题中的"java_record_codes.rar_SWT_java record_java swt_java 屏幕录像"指的是一个使用Java SWT库开发的屏幕录像程序的源代码压缩包。这个程序允许开发者或用户记录计算机的屏幕活动,可能是为了创建教程、演示...

    EFFECTIVE_JAVA_3RD

    6. **接口与抽象类(Interfaces vs Abstract Classes)**:讨论了选择接口还是抽象类的决策因素,如多继承和默认方法的使用。 7. **可变与不可变对象(Immutability)**:推荐尽可能创建不可变对象,以增强安全性、...

    pso_java.rar_Java PSO_PSO_pso java_pso java_pso_JAVA

    2. **Java实现PSO的关键步骤**: - 初始化粒子群体:随机生成每个粒子的位置和速度。 - 计算适应度函数:根据目标问题,评估每个粒子当前位置的优劣。 - 更新粒子的局部最佳位置:如果新的位置比旧的更好,则更新...

    effectiveJava的笔记

    3. **接口与抽象类**:讨论了接口和抽象类在设计上的差异,强调接口用于定义类型,抽象类用于共享实现,以及Java 8引入的默认方法和静态方法。 4. **枚举**:介绍枚举类型的强大之处,如枚举的自动序列化、枚举常量...

    C#抽象类和接口的区别.docx

    在C#编程语言中,抽象类和接口是两种重要的面向对象设计工具,它们都有各自的特性和用途。让我们详细探讨一下它们的区别。 首先,抽象类是一个特殊的类,它不能被实例化,但可以包含抽象方法和非抽象方法。抽象方法...

    java_base1_lang.rar_java_base1_lang ppt

    7. **接口与抽象类**:接口的定义、实现,抽象类的使用,以及接口与抽象类的区别。 8. **内省(Introspection)**:通过反射API动态获取类的信息,如字段、方法等。 9. **IO流**:输入/输出流的使用,包括字符流和...

    SWT.rar_ java swt_SWT_java swt_java s_java swt

    SWT,全称为Standard Widget Toolkit,是Java编程中用于创建图形用户界面(GUI)的一种开源库。它由Eclipse基金会维护,与Java Swing并行存在,提供了与操作系统更紧密的集成,使得应用程序能够呈现出原生的外观和...

    effecctivejava 第三版中文

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,现在已经更新到第三版。这本书深入探讨了如何编写高效、可维护且设计良好的Java代码,是每一个Java开发者提升技能的重要参考资料。以下是对该...

    XML.rar_XML SAX_XML java_dom xml_java xml_java解析xml

    除了Java自带的解析库,还有第三方库如JAXB(Java Architecture for XML Binding)用于对象与XML之间的映射,以及DOM4J、XOM等提供更高级别的接口,简化XML处理。 5. 实战应用: 在实际项目中,根据需求选择合适的...

    abc.zip_Java Word_SWT word_java 取 word_word

    总的来说,Java结合SWT提供了强大的能力来处理Word文档,特别是对于旧版的Word文档,SWT提供了优于纯Java API的性能。通过理解这些库和API的工作原理,你可以构建自己的工具来满足特定的文本抽取需求。"abc.zip...

    Java+2图形设计卷ⅠAWT.chm Java_2_图形设计卷Ⅱ:SWING.chm

    Java图形设计是Java编程中的一个重要领域,主要涉及如何在Java应用程序中创建和管理用户界面。本主题涵盖了两个关键部分:AWT(Abstract Window Toolkit)和Swing,它们都是Java提供的用于构建GUI(图形用户界面)的...

    TreeMap in Java_java_treemap_

    `TreeMap`类继承自`AbstractMap`,实现了`NavigableMap`、`SortedMap`接口,因此它具有丰富的导航功能。 一、`TreeMap`的基本操作 1. **插入元素**:使用`put()`方法将键值对插入到`TreeMap`中。例如,`map.put...

    EffectiveJava:有效的 Java 示例

    2. **接口与抽象类** - **接口优先于抽象类**:书中强调在设计API时应优先考虑使用接口,因为接口提供更好的多态性和可扩展性。 - **避免过多的公开接口和方法**:保持接口简洁,减少API的维护难度。 3. **继承与...

    jedis2_springboot_java_图书管理系统_

    本系统——"jedis2_springboot_java_图书管理系统_",是将SpringBoot技术应用于图书管理系统的实例,旨在展示如何利用SpringBoot构建高效、稳定的业务系统。 1. **SpringBoot基础** SpringBoot的核心理念是“约定...

    实践《Effective Java》书中的经验法则示例代码,结合Java源码来理解这些最佳实践,并应用于实际项目。.zip

    1. **使用接口而非具体类(Item 2)**:这一原则鼓励我们设计可扩展的API,使用接口定义类型,而不是具体类。这样做可以使我们的代码更具灵活性,更容易进行替换和扩展。 2. **考虑将静态导出类作为公共API的一部分...

Global site tag (gtag.js) - Google Analytics