对象杂谈

对于现在编程语言,很多总喜欢讲一切都是对象,很多程序员也都自诩精通OOP,实际上我接触的很多对面向对象这个只停留于背诵上,至于编程上,也只是掌握了“经验”“技巧”。

接口和抽象类是Java面向对象设计的两个基础机制。

接口的设计初衷就是行为的抽象,它是抽象方法的集合,利用接口可以达到API定义和实现分离的目的。

接口,不能实例化;不能包含任何非常量成员,任何feld都是隐含着public static fnal的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java标准类库中,定义了非常多的接口,比如java.util.List。

Java 8增加了函数式编程的支持,所以又增加了一类定义,即所谓functional interface,简单说就是只有一个抽象方法的接口,通常建议使用@FunctionalInterface Annotation来标记。

从Java 8开始,interface增加了对default method的支持。Java 9以后,甚至可以定义private default method。Default method提供了一种二进制兼容的扩展已有接口的办 法。比如,我们熟知的java.util.Collection,它是collection体系的root interface,在Java 8中添加了一系列default method,主要是增加Lambda、Stream相关的功能。我在 专栏前面提到的类似Collections之类的工具类,很多方法都适合作为default method实现在基础接口里面。

 

为了不被淘汰,引入的default method,个人觉得有些打破了模式。

抽象类是不能实例化的类,用abstract关键字修饰class,其目的主要是代码重用。除了不能实例化,形式上和一般的Java类并没有太大区别,可以有一个或者多个抽象方法,也可 以没有抽象方法。抽象类大多用于抽取相关Java类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。Java标准库中,比如collection框架,很多通用 部分就被抽取成为抽象类,例如java.util.AbstractList。

面向对象的基本要素:封装、继承、多态。

封装的目的是隐藏事务内部的实现细节,以便提高安全性和简化编程。封装提供了合理的边界,避免外部调用者接触到内部的细节。我们在日常开发中,因为无意间暴露了细节导致 的难缠bug太多了,比如在多线程环境暴露内部状态,导致的并发修改问题。从另外一个角度看,封装这种隐藏,也提供了简化的界面,避免太多无意义的细节浪费调用者的精力。

继承是代码复用的基础机制,类似于我们对于马、白马、黑马的归纳总结。但要注意,继承可以看作是非常紧耦合的一种关系,父类代码修改,子类行为也会变动。在实践中,过度 滥用继承,可能会起到反效果。能用组合尽量避免继承。

多态最直接的例子就是向上转型,比如我们要写的Map<K,V> map = new HashMap<>();

S.O.L.I.D原则。

single responsibility 单一职责,类或者对象最好是只有单一职责,在程序设计中如果发现某个类承担着多种义务,可以考虑进行拆分。这也是低耦合的策略。

open-close,open for extension,close for modification,开闭原则,设计要对扩展开放,对修改关闭。换句话说,程序设计应保证平滑的扩展性,尽量避免因为新增同 类功能而修改已有实现。

Liskov Substitution,里氏替换,这是面向对象的基本要素之一,进行继承关系抽象时,凡是可以用父类或者基类的地方,都可以用子类替换。

interface segregation,接口分离,我们在进行类和接口设计时,如果在一个接口里定义了太多方法,其子类很可能面临两难,就是只有部分方法对它是有意义的,这就破坏 了程序的内聚性。我们可多实现切勿单实现一个复用率很低的接口。

dependency inversion,依赖反转,实体应该依赖于抽象而不是实现。也就是说高层次模块,不应该依赖于低层次模块,而是应该基于抽象。实践这一原则是保证产品代码之 间适当耦合度的法宝。

Java真是好的不学

        var a = new ArrayList<Integer>();
        a.add(1);

错误的范例

 理论上,这种服务代码都凑在一起不仅耦合而且效率低扩展差,改进

end

一个没有高级趣味的人。 email:hushui502@gmail.com
原文地址:https://www.cnblogs.com/CherryTab/p/12173413.html