曾经有人对我说java的回调很巧妙。

今天我自己看了一下,回调的关键就是一个接口的事情。

也许是因为用了一定的手法,一开始不好懂吧,所以看懂了会感觉巧妙。

但是我心里的想法却是,真啰嗦!

回调的实例

下面是一个回调的实例,截图自网友的文章----https://www.jianshu.com/p/2cbc5232547a。

意思就是,我提前定义了CallBack接口,里面预先约定了giveMe这一行为。

然后Buyer内部有个继承自CallBack的成员,需要在一个方法中传入这个CallBack实例。

Buyer内部有个方法会做一些事情,做完了呢?就会做执行约定好的giveMe行为。

然后Me呢?通过一个匿名内部类实现了CallBack接口,Override了giveMe行为。

这样以后Buyer执行完doThing方法后,就会执行giveMe行为。

本质是什么呢?

本质是动态的替换Buyer类的giveMe行为。

这个本质是语法层面上的。

C#怎么写?

我想让GiveMe方法是活的?那我就放上一个GiveMe方法的指代物----名字也叫GiveMe。

Me想改变Buyer实例的GiveMe行为?给GiveMe这个委托赋值一下就好了。

很明显,使用委托是更加简单直接的做法,更直觉式的。

本质

大家都差不多其实,大家的本质都是一个指针。

大家都是一个【方法引用】的指针指向了【被调用的方法】。

这个本质是原理层面的。

有意思的地方

使用接口的一个好处是,抽出不一样的地方单独修改。也就是光改不一样的地方,一样的地方不修改。

所以,一些人就把多态,抽离组合当作面向对象特有的东西。

但是Java使用接口做出来的回调机制,并不能简洁的把当前例子中【每个Buyer实例的GiveMe行为是不同的】这一区别抽离出来。

java要每次多写一个类,然后重写GiveMe方法才可以。最简单的办法当然是,GiveMe不一样,那我只改GiveMe。

文档

刚才查了一下微软文档,微软文档很贴心的说明了何时应该使用委托,何时应该使用接口。

C#当然也可以使用接口来实现这一功能,但是委托好用的时候就用委托了。

下面是截图。

突然想到

今天我工作的时候就想到,很多框架对人的编码工作都是一种限制,都是强制的让人去使用这种方式而不使用另一种方式来写代码。

如果强制让人用什么框架写的话,就会写的很啰嗦。

那为什么不去除这种约束,然后大家商量出一套编码规范来呢??

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

但是回头想了下并不是这样。

就像墨菲定律说的,如果说有两种写法一种好,一种坏,一定有人会用那种坏的方法去写。

我自己也会,因为代码并不是一口气写好的,越写越多就会越来越乱。

目前人们抱怨的java的啰嗦,大部分是因为java死抱住面向对象设计而产生的,我是面向对象的,那我就用面向对象的方式去解决问题,我就有我的套路。

我java并不是死板,而是有自己的特点。

最后

java是架构师的语言,C#是程序员的语言。

C#把复杂的设计隐藏在了简单的语言特性之中;虽然完全面向对象,但不迷信面向对象;不管是函数式/声明式,只要能简化编码工作,只要好用,那我就支持上。

这是C#最有趣的地方。

java的回调和C#的委托的更多相关文章

  1. Java判断回文数算法简单实现

    好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...

  2. 详解回调函数——以JS为例解读异步、回调和EventLoop

      回调,是非常基本的概念,尤其在现今NodeJS诞生与蓬勃发展中变得更加被人们重视.很多朋友学NodeJS,学很久一直摸不着门道,觉得最后在用Express写Web程序,有这样的感觉只能说明没有学懂 ...

  3. java序列回显学习

    java反序列化回显 在很多不出网的情况下,一种是写webshell(内存嘛),另一种就是回显,本文先学习回显,回显的主要方式有一下几种. defineClass RMI绑定实例 URLClassLo ...

  4. Java——判断回文

    package basic; import java.util.Scanner; public class Palindrome{ public static boolean isPalindrome ...

  5. Java实现回文判断

    1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有两种方法可供参考: (1)从字符串两头 ...

  6. 【练习】使用接口回调和handler实现数据加载到listview

    代码结构 布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  7. Java 判断回文字符串有多少和其中的最大字符串

    一.简介代码功能 该代码的功能可以实现对任意的一段字符串进行判断是否有回文,回文有哪些,和其中的最大回文. 二.代码部分 1.全局变量 static String hws = "" ...

  8. java基础——回文数判断

    /** * 题目描述: * 有这样一类数字,他们顺着看和倒着看是相同的数,例如:121,656,2332等,这样的数字就称为:回文数字.编写一个函数,判断某数字是否是回文数字. * 要求实现方法: * ...

  9. learning java 推回输入流

    import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import ...

随机推荐

  1. ES6基本语法入门

    一.用let代替var声明变量 ES5中,我们可以在代码中任意位置声明变量,甚至可以重写已经声明的变量,ES6引入了一个let关键字,它是新的var. let language = 'javascri ...

  2. .NET Core3.0 日志 logging

    多年的经验,日志记录是软件开发的重要组成部分.没有日志记录机制的系统不是完善的系统.在开发阶段可以通过debug附件进程进行交互调试,可以检测到一些问题,但是在上线之后,日志的记录起到至关重要的作用. ...

  3. Java IO_002.InputStream与OutputStream--字节流对数据的操作(读取与写入)

    Java IO之FileInputStream与FileOutputStream对象常用操作 涉及到文件(非文件夹)内容的操作,除了要用到File(见之前文章),另外就必须用到输入流或输出流. 输入流 ...

  4. Pythonyu语法入门01

    引子 ​ 基于上一篇所学,有了计算机硬件,再在硬件之上安装好操作系统,我们就有了一个应用程序的运行平台,我们接下来的任务就是学习如何使用某款编程语言来开发应用程序. ​ 本篇的主题是先带大家了解下编程 ...

  5. 最常用 最完整 最清晰 的git使用命令大全!

    Git 常用命令 初始化项目步骤 mkdir WebApp //创建文件夹 cd WebApp //进入到该文件夹 git init //初始化 touch README //生成README git ...

  6. 暑期集训20190725 加法(add)

    [题目描述] 数学课,黑板上写着n个数字,记为A1到An,fateice会重复以下操作若干次: 1. 选择两个奇偶性相同的整数Ai和Aj, 将他们擦去 2. 将Ai+Aj写在黑板上 问黑板上最终是否有 ...

  7. [考试反思]0825NOIP模拟测试30:没落

    AB卷,15人. Lrefrain rank#1 179 skyh rank#2 122 116 108 54 42虽说还是不怎么样,但是有好转的迹象. 开卷审题,T1是个(假)期望,感觉也许还可做. ...

  8. 从0开始编写webpack插件

    1. 前言 插件(plugins)是webpack中的一等功臣.正是由于有了诸多插件的存在,才使得webpack无所不能.在webpack源码中也是使用了大量的内部插件,插件要是用的好,可以让你的工作 ...

  9. ElasticSearch(四):基本搜索

    ElasticSearch(四):基本搜索 学习课程链接<Elasticsearch核心技术与实战> URI Search 使用HTTP的GET方法,在URL中使用查询参数进行查询. GE ...

  10. mysql General error: 1366 Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...' for column 'dianpumiaoshu' at row 1 解决方法

    mysql General error: 1366 Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...' for column 'dianpumi ...