我想要的程序开发语言特性——之“面向对象”——之“退化”

先从一个例子开始讲起,以下是jdk1.7中的迭代器接口的代码(去掉了注释的部分):



public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}



程序开发的老油条们都不太喜欢这个接口的remove方法,原因可能是:

  1. 我们为自己实现Iterator接口时,基本不需要这个方法,但我们却不得不@Override它,此时通常我们会直接在方法体中写一行throw new UnsupportedOperationException();来搞定它。

  2. 这个方法的性能通常不太好,对ArrayList的迭代器频繁的做这个操作的性能远不如创建一个新的ArrayList对象。

或许,这个接口没有remove方法会更好,但这个接口已经这样了,要保持向上兼容的话,就不可能修改jdk去掉这个方法。

那么我们在不改变原有类的情况下,如何“退化”掉原有类中的方法呢?

当我们自己的类需要迭代器时,我们是否可以直接使用自己的接口,而不使用jdk自带的接口呢:



public interface MyIterator<E> {
    boolean hasNext();
    E next();
}



这样当然是可以的,但这样就无法直接适配到jdk自带的集合框架了。

所以通常我们会这样做:



class MyIteratorImp implements Iterator<Object> {
    private Iterator<Object> itr;
    public MyIteratorImp(Iterator<Object> itr){
        this.itr = itr;
    }
    public boolean hasNext() {
        return itr.hasNext();
    }
    public Object next() {
        return itr.next();
    }
    public void remove() {
       throw new UnsupportedOperationException();
    }
}



这里我们根本不需要remove方法,但我们不得不去实现它,因为这是Java的语法(这样实现多少会让人有点不爽)。

我们可能非常希望实现这样一个接口:



interface MyIterator<T> extends Iterator<T> {
    不要这个方法: void remove();
}



这样,我们实现自己的迭代器时不需要再override remove方法,同时又是jdk标准接口Iterator的实现,这样基本上满足了我们要求。

不过遗憾的是,我们没有这样的语法。

或许有人认为这样做也是可以的(使用抽象类):



abstract class MyIteratorImp<T> implements Iterator<T> {
    public void remove() {
        throw new UnsupportedOperationException();
    }
}



但抽象类相对于接口却有一个缺点:在一些不支持多重继承的语言中(例如Java),我们继承了抽象类之后就没有继承其它类的可能性了。

或许我们可以考虑在一门语言中实现一个“退化”的语法,这样就可以:

  1. 实现接口或类时可以从某接口或类中去掉一部分方法

  2. 在某些对象中去掉一部分方法。

在一些动态类型语言中已经有这样的功能了,比如Groovy和Python。

上面的第1点其实并非必须是动态语言才能实现的(但到现在我还没有看到哪个静态类型语言有这样的功能),但第2点就一定是动态语言才行了(因为有些情况下,不到运行时,我们无法确定对象会什么时候被创建出来,甚至创建对象的代码我们都不知道在哪里,我们只是使用这个对象)。

Java进化到Java8之后,有了一个不错的选择:接口默认实现。

实际上Jdk1.8中的Iterator接口的实现已经是这个样子了:



public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}



接口默认实现使“接口”在很大程度上变成了“抽象类”——Java本来不支持的多重继承在Java8开始已经在某种程度上打破了。

从设计模式的角度来看,对类或接口的退化能力似乎又违反“里氏替换原则”,不过既然一开始就是这错误,而且退化能力可以在一定程度上抹掉“先辈的罪”,那么有时候也不要太讲原则了。

我想要的程序开发语言特性——之“面向对象”——之“退化”,布布扣,bubuko.com

时间: 2024-12-23 15:18:51

我想要的程序开发语言特性——之“面向对象”——之“退化”的相关文章

作业1: 通过百度、CDSN、新浪微博、知乎等互联网资源了解以下“程序开发语言”的应用领域。....

通过百度.CDSN.新浪微博.知乎等互联网资源了解以下“程序开发语言”的应用领域: C和C++ 一般用于服务端的服务程序开发,硬件编程开发,系统等等大量框架要用到的.JAVA,学好这个可以开发移动设备程序,JSP网页程序.C#,学了这个可以开发Winform,WPF,ASP.NET,等等..即.NET的一个系.VB:Windows窗口应用程序开发.Delphi:强大的窗口编程软件,执行效率很高.Matlab:这个是数学软件,一般作为开发股票软件. 通过海峡人才网.拉勾网了解相关程序语言在什么岗位

Eric Raymond对于几大程序开发语言的评价

Eric Raymond是开源运动的领袖人物,对于UNIX开发有很深的造诣,主持开发了fetchmail.他的<大教堂与集市>被奉为开源运动的经典之作.下面对几大开发语言的评价非常中肯,是我近年来看到的比较出色的评论.特别是他评价中抱有的那种"简单就是好"的思想,很值得我们深思.我特别选译出一些段落,供大家阅读思考.Raymond此文不是在泛泛地去谈语言的优劣,而是要回答一个问题:在UNIX下开发开源项目,如何选择开发工具?我翻译的很零散,建议大家去看原文. 参考:http

通过百度、CDSN、新浪微博、知乎等互联网资源了解以下“程序开发语言”的应用领域。 通过海峡人才网、拉勾网了解相关程序语言在什么岗位上需要使用。

C和C++ 一般用于服务端的服务程序开发,硬件编程开发,系统等等大量框架要用到的.JAVA,学好这个可以开发移动设备程序,JSP网页程序.C#,学了这个可以开发Winform,WPF,ASP.NET,等等..即.NET的一个系.VB:Windows窗口应用程序开发.Delphi:强大的窗口编程软件,执行效率很高.Matlab:这个是数学软件,一般作为开发股票软件等等.

PHP和Java的主要区别有哪些?哪个最适合Web开发语言?

一.前言 PHP和Java都是现在比较流行的二种编程语言. 对于许多新手来说,都会思考如果学的时候,该学哪种语言呢?下面这篇文章给大家整理两者的区别以及一些选择建议,一起来看看吧. 二.简介 PHP与Java作为两种截然不同的程序开发语言,无论是技术层面还是发展空间,亦或是市场份额占比,都有着不同的表现方式,理念上的不同导致了Java和PHP在Web应用开发上显示了不同的结果.若要一定追根到底,深究PHP与Java究竟哪个更好? 简而言之:PHP是一种解释执行的脚本语言,语法和C语言类似,易学易

【转载】谷歌酝酿将苹果Swift作为安卓APP主要开发语言

TNW中文站 4月8日报道 安卓操作系统的软件开发语言是Java,而在过去几年中,有关Java的版权,谷歌(微博)和甲骨文之间发生了长期的诉讼.最新外媒消息称,谷歌正在考虑将苹果开发的Swift作为未来安卓软件开发的“一级”语言,此外Facebook.Uber等公司也开始越来越重视Swift的使用. 据美国科技新闻网站TheNextWeb引述知情人士报道,此前苹果Swift转变为开放源码语言,而谷歌.Facebook.和Uber三家公司的代表曾经在英国伦敦开会,专门讨论Swift语言,谷歌决定逐

程序开发心理学阅读笔记——结束篇

作为个人行为的程序开发及程序开发工具 程序开发的差异->人格因素->智力水平以及问题求解能力->积极性.培训以及实验1.我们所关注的个体偏差,可以进一步地按照一般性的方式被划分为“个性”.“智力”.以及“培训”或者“经验”.2.如果需要衡量程序员的绩效.语言的性能.操作系统的性能,或者其他方面,我们首先需要确定的是:所有人正在为之努力的,是同一个问题.3.要把定义说明转换成最中的程序,需要经过各种不同的工作:而为了完成这些不同的工作,就必须要有各种类型的人才.4.程序开发并不是一个一成不

Java基础学习(一)——语言特性及开发环境搭建

学习了一段时间的Java,想通过几篇文章做一下这一段时间的学习总结.由于有c/c++的一些基础,总的来说Java语言还是挺具有亲和感的.虽然经常到博客园找资料,但是也一直没有自己动手写过博客,现在练练手,也为日后有个回忆吧. 一,Java简介 1.语言起源 语言起源:Java是SUN ( Stanford University Network 斯坦福大学网络公司 ) 1995年推出的一门高级编程语言.Java名称的来源Java最初被命名为Oak,目标在于家用电器等小型系统的编程语言,随着市场的变

C++应用程序性能优化(三)——C++语言特性性能分析

C++应用程序性能优化(三)--C++语言特性性能分析 一.C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高但性能要求并不是很高的程序.因为大多数开发人员认为,C++语言设计时因为考虑到支持多种编程模式(如面向对象编程和范型编程)以及异常处理等,从而引入了太多新的语言特性.新的语言特性往往使得C++编译器在编译程序时插入了很多额外的代码,会导致最终生成的二进制代码体积膨胀,而且执行速度下降.但事实并非如此

【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展

Swift是一种新的编程语言,用于编写 iOS 和 OS X 应用.Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制.Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣.我们的腾讯Bugly移动开发者沙龙第二期就是围绕这一主题展开的,很多同学表示听的不够过瘾,因此小编特意邀请分享者将精华整理成文字,来于大家分享. 首先我们考察一下Swift究竟是一个什么样的变成语言.在2014年苹果的WWDC(世界开发者大会)上,Swift首次亮