<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>语言 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E8%AF%AD%E8%A8%80/</link><description>Recent content in 语言 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 23 Feb 2018 14:27:37 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E8%AF%AD%E8%A8%80/index.xml" rel="self" type="application/rss+xml"/><item><title>Kotlin 扩展函数详解与应用</title><link>https://pangyd.com/post/185-kotlin/</link><pubDate>Fri, 23 Feb 2018 11:31:21 +0800</pubDate><guid>https://pangyd.com/post/185-kotlin/</guid><description>&lt;h1 id="一什么是扩展函数">&lt;a href="https://www.jianshu.com/u/dcf7bd45aecd" target="_blank">一、什么是扩展函数？&lt;/a>&lt;/h1>&lt;p>扩展函数数是指在一个类上增加一种新的行为，甚至我们没有这个类代码的访问权限。这是一个在缺少有用函数的类上扩展的方法，Kotlin能够为我们做到那些令人关注的事情，而这些Java做不到。&lt;/p>&lt;p>在Java中，通常会实现很多带有static方法的工具类，而Kotlin中扩展函数的一个优势是我们不需要在调用方法的时候把整个对象当作参数传入，它表现得就像是属于这个类的一样，而且我们可以使用this关键字和调用所有public方法。&lt;/p>&lt;h1 id="二扩展函数的使用">&lt;a name="t1">&lt;/a>&lt;a href="https://www.jianshu.com/u/dcf7bd45aecd" target="_blank">二、扩展函数的使用&lt;/a>&lt;/h1>&lt;h3 id="1函数的扩展">&lt;a name="t2">&lt;/a>（1）函数的扩展&lt;/h3>&lt;p>简单来说，Kotlin扩展函数允许我们在不改变已有类的情况下，为类添加新的函数。例如，我们能够为Activity中添加新的方法，让我们以更简单术语显示toast，并且这个函数不需要传入任何context，它可以被任何Context或者它的子类调用，比如Activity或者Service：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs avrasm has-numbering">fun Context&lt;span class="hljs-preprocessor">.toast&lt;/span>(message: CharSequence, duration: Int = Toast&lt;span class="hljs-preprocessor">.LENGTH&lt;/span>_SHORT) {
 Toast&lt;span class="hljs-preprocessor">.makeText&lt;/span>(this, message, duration)&lt;span class="hljs-preprocessor">.show&lt;/span>()
}&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;li>3&lt;/li>&lt;/ul>&lt;/pre>&lt;p>当然你也可以这样写：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs avrasm has-numbering">fun Activity&lt;span class="hljs-preprocessor">.toast&lt;/span>(message: CharSequence, duration: Int = Toast&lt;span class="hljs-preprocessor">.LENGTH&lt;/span>_SHORT){
 Toast&lt;span class="hljs-preprocessor">.makeText&lt;/span>(this, message, duration)&lt;span class="hljs-preprocessor">.show&lt;/span>()
}&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;li>3&lt;/li>&lt;/ul>&lt;/pre>&lt;p>对参数的解释：&amp;nbsp;&lt;br>- Activity：表示函数的接收者，也就是函数扩展的对象&amp;nbsp;&lt;br>- . ：扩展函数修饰符&amp;nbsp;&lt;br>- toast：扩展函数的名称&lt;/p>&lt;p>我们可以在任何地方（例如在一个工具类文件中）声明这个函数，然后在我们的Activity中将它作为普通方法来直接使用（这里的两种使用方式后文会做解释）：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs scss has-numbering">override fun &lt;span class="hljs-function">onCreate(savedInstanceState: Bundle?)&lt;/span> { 
 &lt;span class="hljs-value">super&lt;/span>&amp;lt;BaseActivity&amp;gt;&lt;span class="hljs-class">.onCreate&lt;/span>(savedInstanceState)
 &lt;span class="hljs-function">toast(&lt;span class="hljs-string">"This is onCreate!!"&lt;/span>)&lt;/span>
 &lt;span class="hljs-function">toast(&lt;span class="hljs-string">"Hello world!"&lt;/span>, Toast.LENGTH_LONG)&lt;/span>
}&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;li>3&lt;/li>&lt;li>4&lt;/li>&lt;li>5&lt;/li>&lt;/ul>&lt;/pre>&lt;p>当然了，Anko已经包括了自己的toast扩展函数，跟上面这个很相似（关于Anko是什么，你可以看我的这篇文章。。。）。Anko提供了一些针对CharSequence和resource的函数，还有两个不同的toast和longToast方法：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs erlang has-numbering">&lt;span class="hljs-function">&lt;span class="hljs-title">toast&lt;/span>&lt;span class="hljs-params">(&lt;span class="hljs-string">"Hello world!"&lt;/span>)&lt;/span>
&lt;span class="hljs-title">longToast&lt;/span>&lt;span class="hljs-params">(&lt;span class="hljs-variable">R&lt;/span>.id.hello_world)&lt;/span>&lt;/span>&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;/ul>&lt;/pre>&lt;p>&lt;strong>有一点值得注意：&lt;/strong>扩展函数并不是真正地修改了原来的类，它的这些作用效果是以静态导入的方式来实现的。扩展函数可以被声明在任何文件中，因此有个通用的方式是把一系列有关的函数放在一个新建的文件里，就像我们刚才所说的工具类当中。&lt;/p>&lt;p>我觉得还是再举几个几个例子来说明一下吧，因为它们完全显示扩展函数的力量。&lt;/p>&lt;h5 id="在-toast-中的高级用法">● 在 Toast 中的高级用法&lt;/h5>&lt;p>我们首先看看这个例子：&lt;/p>&lt;pre class="prettyprint">&lt;code class="hljs avrasm has-numbering">fun Context&lt;span class="hljs-preprocessor">.niceToast&lt;/span>(message: String,
 tag: String = javaClass&amp;lt;MainActivity&amp;gt;()&lt;span class="hljs-preprocessor">.getSimpleName&lt;/span>(),
 length: Int = Toast&lt;span class="hljs-preprocessor">.LENGTH&lt;/span>_SHORT) {
 Toast&lt;span class="hljs-preprocessor">.makeText&lt;/span>(this, &lt;span class="hljs-string">"[$className] $message"&lt;/span>, length)&lt;span class="hljs-preprocessor">.show&lt;/span>()
}&lt;/code>&lt;ul class="pre-numbering" style="text-align: right">&lt;li>1&lt;/li>&lt;li>2&lt;/li>&lt;li>3&lt;/li>&lt;li>4&lt;/li>&lt;li>5&lt;/li>&lt;/ul>&lt;/pre>&lt;p>我们增加了一个默认值是类名的参数，如果这是在Java中的话，那么总数开销会以几何形式增长，而现在我们可以通过以下方式调用：&lt;/p></description></item><item><title>JVM 语言的兴衰史</title><link>https://pangyd.com/post/132-jvm/</link><pubDate>Thu, 12 Oct 2017 23:38:25 +0800</pubDate><guid>https://pangyd.com/post/132-jvm/</guid><description>&lt;p>不管什么时候，都会有一些预测 Java 覆灭的帖子出现。但有趣的是，这些帖子从不写预言成真的日期。说实话，它们说的都算正确，因为这是每一种语言的最终命运都是：覆灭湮没，准确地说是越来越少地被利用到新项目中。问题是：最后谁会取代它们呢？&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>上周我们在 InfoQ 一篇同样类型的文章。至少，这篇文章说出来这个语言可能的替代者 Kotlin。这让我对 JVM 的语言现状和趋势有了许多思考：注意，语言的趋势与每个语言的技术优点和缺点无关。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>我于 2001 年年底开始做 Java 开发，当时，Java 是真的很酷。每一个新开发者都想使用所谓的新技术：无论是 .NET 还是 Java，而有经验一些的开发者使用的是 COBOL。我在学校学习了 C 和 C++，所以 Java 内存管理对于我来说非常简单。我对 Java 很满意，但并不是每个人都这么认为。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Groovy 诞生于 2003 年。但我不记得我是什么时候开始学习它的。而实际上：使用它后我不再需要一门脚本语言了。在具有多个开发团队并长时间开发企业级应用程序的背景之下，静态类型相比动态类型拥有巨大优势。尤其在进行产品测试以检查类型系统时。我唯一需要创建脚本的时候，是作为 WebSphere 管理员时：选择 Python 还是 TCL。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>一年之后，Scala在2004年被我接受。 我不记得是什么时候以及是怎样知道Scala的，但那时候确实是很晚了。与Groovy相反，我决定试试它。主要的理由是我长期以来对创建“更好”的代码（更好的可读性和可维护性）感兴趣。Scala是静态类型的，它更像我正在寻找的东西。我报了Coursera课程Scala中的函数式编程原理。它有三个主要的影响：&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>它让我质疑我写Java代码的方式。 例如，为什么当我设计类时要自动生成getter和setter方法？&lt;/p>&lt;p>对大多数开发者来说，我觉得Scala很容易写出缺乏可读性的的代码——包括我。&lt;/p>&lt;p>我开始寻找其他替代语言。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>在 Groovy 和 Scala 之后，第二代（如果你把 Java 也算做第一代的话，则是第三代）JVM 语言包括：&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>JetBrains Kotlin&lt;/p>&lt;p>Red Hat Ceylon&lt;/p>&lt;p>Eclipse eXtend&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>大致浏览一遍后，我确信他们没有太多的吸引力，不值得我投入时间。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>几年前，我决定自学基本的 Android 开发，以便能够了解移动开发者的开发环境。好家伙，即使有多年开发 Java EE 和 Spring 应用程序的经验，但它还真给我一个惊喜了 - 还不是愉快的那种。这就像回到过去十年前那样的开发体验，Android &amp;nbsp;API 非常低级，更别说在本地测试应用程序。经过快速的搜索相关信息，我发现 Kotlin 在很多地方被提到，所以最后决定试一试。我立即爱上 Kotlin 了，得亏它的扩展功能，我可以将现有的垃圾 API 改进得更好，甚至更优雅。我开始更多的挖掘这门语言，并开始在服务器端项目中使用 Kotlin。然后，Spring 框架宣布了与 Kotlin 的整合。然后在 Google I/O 大会上，Google 也宣布在 Android 开发中官方支持 Kotlin。&lt;/p></description></item></channel></rss>