作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Boldizsar Akos Mezei的头像

Boldizsar Akos Mezei

Boldizsar是一名Java/Scala后端开发人员,曾在摩根士丹利从事微服务组的工作.

以前在

摩根士丹利(Morgan Stanley)
分享

我不需要向原生安卓开发者介绍芬兰湾的科特林, 自2017年5月起, 谷歌宣布它将成为安卓开发的官方语言. 从那时起, 它已经成为开发新的、闪亮的安卓应用程序的主要语言选择. 它解决了Java的许多痛点, 因此,新的应用程序大多是用它编写的, 旧的在里面被重写.

毫无疑问,它在应用程序的前端非常出色, 当你第一次提到芬兰湾的科特林, 大多数人把它和安卓系统联系在一起. 然而, 在本文中, 我将谈论芬兰湾的科特林作为后端语言,我想分享我关于创建一个快速的, 可靠的, 和异步芬兰湾的科特林后端为我的安卓业余项目. 我不会讨论这个项目是关于什么的, as it is out of the scope of 这 article; rather, 我将重点解释为什么我选择芬兰湾的科特林,以及为什么我认为它是编写服务器端应用程序或REST api的优秀语言.

为什么芬兰湾的科特林?

让我回到我旅程的最开始. 我一直有创业的野心, 我认为这条路的第一步是自己创造一些东西. 没有什么大, 没有什么改变, 只是一些我和我的家人和朋友可以使用的小东西. 在有了一个合理的想法后,我立即投入其中并开始执行它. 在任何项目开始时要做的第一件事就是选择工具. 毕竟,从长远来看,正确的工具集可以为您节省大量的时间和金钱. 这就是我所做的.

我主要是一个Java开发人员. 我使用Java和Spring编写了几个后端系统和REST api, 我确实认为这两个是做这些事情的好工具. Java本身就是一门综合性的语言, 但是结合Spring, 没有什么是你不能实现的.

然而,汤里只有一根细小的头发. 冗长. 尽管Spring和最新版本的Java在这方面帮助很大, 但是,您仍然需要处理大量的样板代码. 曾经有个好人告诉我,最安全的, 最可靠的, 没有bug的代码是没有写下来的代码. 以这个简单的Java类为例:

公共类Person {
	private final String name;
	私有最终int;
	public Person(String name, int age) {
    	这.Name = Name;
    	这.年龄=年龄;
	}

	公共字符串getName() {
    	返回名称;
	}
	public int getAge() {
    	返回年龄;
	}
}

在我看来,这是大量的代码,只是为了说明“我想要一个具有两个只读字段的类”.“最糟糕的部分是构造函数和方法是自动生成的. 仍然, 当你在审查拉取请求时, 你总是通过它们,因为, 好吧, 你永远不知道他们是否是你所需要的. 确定, 这可以使用第三方库(如Lombok)来缩短, 但如果我们能在盒子里做这个不是很好吗? 让我们看看芬兰湾的科特林中相同的类:

类人(
	瓦尔 name:字符串,
	年龄:Int
)

它肯定更短更简单. 变量是最终的 瓦尔 keyword; the constructor 和 the getters are generated at compile time. 如果不希望使用不可变的person对象,可以简单地进行更改 瓦尔 to var瞧,我们有了一个可变人,我们所要做的只是改变一个字母.

在简单的Java POJO类中,我最喜欢的第二个部分是重写 equals ()hashCode (). 大多数情况下这些都是自动生成的, 但你总是要重温一遍, 只是为了确保. 好消息是芬兰湾的科特林也可以处理这个问题. 只需改变你的 class 到一个 数据类,就得到 equals ()hashCode () 开箱即用.

数据类Person(
	瓦尔 name:字符串,
	年龄:Int
)

简而言之, 尽管我喜欢Java, 我想在短时间内尽快为我的项目创造一个最小可行的产品. 在软件开发的情况下,实现这一点的最简单方法是编写更少的代码. 因此,我继续寻找一种更好的后端开发语言. 带着这样的想法,我首先转向了节点.js. 它有一些显著的优点—只需几行代码,Express服务器就可以启动并运行了, 在端口8080上监听, 然后用 你好世界。! 每次发送get请求时.

Let express = require('express')
让应用程序 = express();
应用程序.get('/', (req, res) => res.发送(“你好世界。!'));
应用程序.听(8080);

容易,简单,快速. 这正是您对最流行的编程语言之一的期望. 我确实喜欢使用JavaScript, 在那短暂的一刻, 我以为我找到了合适的工具, 但后来我被JavaScript是动态类型的这一事实所困扰. 别误会我, 我确实认为动态类型在前端是很棒的, 但根据我的经验, 拥有静态类型的后端只是给您额外的信心,使您的服务器不太可能因为类型不匹配而在运行时崩溃. 说实话吧, 当您的后端服务于数十万用户时, 你真的不希望发生这种事. 节点.js, 然而, 提供了我想保留的一个很棒的功能, 哪一个是能够轻松地编写异步代码和服务.

考虑到这些需求,我选择在芬兰湾的科特林中编写我的芬兰湾的科特林 安卓后端.

芬兰湾的科特林:快速概述

对于那些以前从未听说过的人来说, 芬兰湾的科特林是一个开源软件, 支持面向对象和函数式编程的静态类型编程语言. 它提供了与c#相似的语法和概念, Java, 或Scala,它主要针对JVM,但也有针对JavaScript或本机代码的变体. 它与Java非常相似,芬兰湾的科特林/JVM将编译成Java字节码, 所以对于那些有JVM背景的后端工程师来说, 芬兰湾的科特林很容易掌握.

作为它的 官方页面 州, 芬兰湾的科特林的目标不是独树一帜,而是从几十年的语言发展中汲取灵感和最佳实践. 它可以与任何Java IDE一起使用,也可以从命令行使用, 但我个人更喜欢并推荐使用它 IntelliJ. 它是由积极维护和升级 JetBrains 团队, 如果你刚开始使用芬兰湾的科特林,不要担心购买付费版本, IntelliJ的社区版将满足您的所有需求. 我想指出的芬兰湾的科特林的三个最重要的方面是:a)简洁(它大大减少了样板代码), B)安全(一方面), 它是为避免空指针异常而构建的), c)可互操作(您可以利用JVM的现有库), 安卓, 或者浏览器).

芬兰湾的科特林协同程序

每个人都希望拥有能够快速为用户提供服务的服务. 以达到服务器的最大容量, 您可以做的第一件事是拥有一个多线程应用程序. Java在这方面相当麻烦. 当你学习Java时, 如果您想要一个多线程应用程序,首先要了解这一点, 您应该扩展Thread类或实现Runnable接口. 初学者永远不会真正理解两者的区别(如果有区别的话)。, 但更让人困惑的是, 它们还被告知总是用run方法启动一个线程, 永远不要使用start方法. 或者,等等,是不是反过来了? 毕竟, 没关系, 无论如何,都不应该手动启动线程, 太贵了, 而是使用线程池. 简单,但事实并非如此.

幸运的是,芬兰湾的科特林有一个更简单的解决方案,称为协程. 简单地说, 协程使异步写入成为可能, 非阻塞代码以非常流畅的方式. The core idea is having functions that can be suspended; in other words, 计算可以在某个时刻暂停,稍后再恢复. 最好的部分是在编写非阻塞代码时, 编程模型实际上并没有改变,因此编写非阻塞代码本质上与编写阻塞代码是一样的. 我们来看两个例子:

sendRequest(): Int {
   /*做一些繁重的工作*/
   返回1;
}

这个例子展示了一个阻塞函数. 执行此代码片段的线程在函数返回之前不会做任何其他工作, 在API或数据库调用的情况下,可能需要几秒钟. 我们真的不想在等待另一个服务时阻塞我们的线程,所以让我们把这个函数变成一个非阻塞的.

sendRequest(): Int {
   /*做一些繁重的工作*/
   返回1;
}

这个例子展示了如何将我们的方法转换成一个能够挂起的非阻塞函数. 这意味着,如果为了简单起见,繁重的工作是简单的 延迟() 的函数调用 10 秒, 在这段时间内,执行线程将继续处理其他任务,并在10秒后恢复函数的执行. 很好,非阻塞代码实现一个关键字.

使用Ktor的异步服务

在编写REST api时, 还有一些额外的步骤是必须采取的, 比如启动嵌入式服务器或解析请求, 当然, 没人想手工做. Java有Spring引导, 这让事情变得简单了吗, 幸运的是, 芬兰湾的科特林有一个名为Ktor的框架. Ktor是一个用于构建异步服务器的web框架. 作为它的 网站 Ktor是“易于使用、有趣且异步的”.“现在, 乐趣是主观的, 所以我不想证明这一点, 然而, 让我们来看一个证明易于使用和异步的代码片段.

Fun main() {
	embeddedServer(Tomcat, 8080) {
    	路由{
        	得到{
            	呼叫。.回应(“Hello world!")
        	}
    	}
	}.启动(wait = true)
}

上面的示例展示了一个运行在嵌入式Tomcat服务器上的功能齐全的芬兰湾的科特林 Ktor服务器, 监听端口8080, 并将以“Hello world”异步响应!获得请求. 所有这些都用不到10行代码完成.

Ktor显然能做的远不止这些. 呈现Ktor的所有特性需要专门的文章, 但在许多事情中, 它使登录和身份验证非常容易. 阅读更多关于Ktor可以在服务器端做什么以及如何配置它的信息 在这里.

芬兰湾的科特林在后端的其他好处

我想指出的第一个好处是,您可以在芬兰湾的科特林中使用Java库, 相信我, 有很多很棒的第三方Java库可以让您的生活更轻松. 既然有开源,为什么还要写自己的实现呢, 现成的库完美地完成了这项工作? 使用这些与芬兰湾的科特林完美地工作.

芬兰湾的科特林和Ktor的另一个主要优点是您可以使用广泛的测试库和框架. Junit框架与芬兰湾的科特林一起工作就像有魅力一样, Ktor在此基础上添加了自己的测试库,允许您立即编写端到端测试和集成测试. 您可以使用一个定制的测试引擎来运行整个应用程序,并且可以像实际应用程序一样处理请求.

结论

正如我之前提到的, 我主要是一个Java后端开发人员,背后有几个服务器端应用程序和REST api. 虽然我喜欢用Java编程, 我认为没有一种最好的语言或框架可以完美地解决任何工作和任何问题. 我的方法是熟悉尽可能多的工具, 当问题来临时, 选择能够完美解决特定问题的最佳工具.

正如芬兰湾的科特林网站所述, the aim of 芬兰湾的科特林 is not to be unique; instead, 它从几十年的语言发展中汲取灵感和最佳实践, 当涉及到后端开发时,我确实相信这一点, 芬兰湾的科特林, 协同程序, 和Ktor组成了一个出色的三人组来完成这项工作. 您可以阅读更多关于芬兰湾的科特林及其作为编程语言的有用性的信息 在这里.

了解基本知识

  • 协程是异步的吗?

    是的. 协程是异步操作并在必要时挂起的线程, 然后重新启动. 它们可用于在后端实现高水平的性能.

  • 芬兰湾的科特林是后端语言吗?

    虽然很少有编程语言可以严格划分为前端或后端, 芬兰湾的科特林具有静态类型等特性,使其易于用于后端编程.

  • 芬兰湾的科特林在后端好用吗?

    由于协程等高性能特性和使用Java库的能力, 芬兰湾的科特林是一种优秀的后端开发语言.

  • 协程是线程吗?

    是的. 协程是可运行和可挂起的线程. 它们帮助应用程序同时管理多个用户活动.

聘请Toptal这方面的专家.
现在雇佣
Boldizsar Akos Mezei的头像
Boldizsar Akos Mezei

位于 匈牙利布达佩斯

成员自 2020年3月17日

作者简介

Boldizsar是一名Java/Scala后端开发人员,曾在摩根士丹利从事微服务组的工作.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

以前在

摩根士丹利(Morgan Stanley)

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.