Kotlin示例:类和属性

最近几个月我一直在使用Kotlin,对此我感到非常满意! 对于不了解它的人来说,它是由JetBrains(IntelliJ背后的公司,因此是Android Studio)构建的一种语言,可以编译为Java的相同JVM字节码。

这是一种非常现代且美观的语言,可以与其他Java文件一起使用,因此不需要转换整个项目。

在这篇博客中,我将向您展示如何用Kotlin编写通常在Android / Java项目中编写的内容,以及为什么用Kotlin编写代码更快,更好::)。

让我们从Java类的标准定义开始:

public abstract class Car {
    private String name;
    Car(String name){
        this.name = name;
    }
}
public class Ford extends Car{
    private String model;
    private String color;

    Ford(String model, String color){
        super("Ford");
        this.model = model;
        this.color = color;
    }
}
Ford focus = new Ford("Focus", "blue")

相当标准的Java类,我们有一个名为“ Car”的基本抽象类和一个扩展Car的适当的类“ Ford”。 在Kotlin中,相同的代码将是:

abstract class Car(val name: String)

class Ford(val model: String, val color: String) : Car("Ford")

val focus = Ford("Focus", "Blue")

因此15条Java代码行只有3条! 在Kotlin中,您可以在类定义中内联定义构造函数,并且根据字段的可见性免费拥有getter和setter(稍后将对此进行详细介绍)。 Java的“ extends”关键字仅由一个“:”代替,您还可以内联抽象类的构造函数(在本例中为Car(“ Ford”))。

Ford focus = new Ford("Focus", "blue")
focus.getName()    -> java way
val focus = Ford("Focus", "Blue")
focus.name         -> kotlin way

构造函数和方法也支持默认值,而Java无法做到这一点:

class Ford(val model: String, val color: String = "Blue") : Car("Ford")
val focus = Ford("Focus")
println(focus.color)          -> prints Blue

在对象的创建中也可以使用命名字段,这解决了我认为Java的主要问题之一:了解用于创建新对象的字段的含义。 因此,让我们想象一下Java中的Book类,其中一个参数作为字符串:

Book book = new Book("George")

什么是“乔治? 是作者吗? 书名? 书的主人? 在Kotlin中,您可以执行以下操作:

Book book = new Book("George")     -> Java
val book = Book("George")          -> Kotlin like Java
val book = Book(author="George")   -> more expressive way

绝对更好!

在Kotlin中,您可以在类的开头添加关键字“ data”,如果这样做,编译器将为“ free”添加以下方法:

  • 等于()/hashCode()对,toString()格式为“ Ford(name = Ford,model = Focus)”的形式,零件()复制()

因此,仅需一个关键字,您就可以免费获得大量代码! 我想告诉你什么零件()函数的意思是因为这是您在Java中无法做到的。 想法是您可以破坏类的声明:

val focus = Ford("Focus", "Blue")
val (model, color) = focus
println("$model and $color")   -> this will print: "Focus and Blue"

复制方法对于从上一个对象创建另一个对象也非常有用:

val focus = Ford("Focus", "Blue")
val yellowFocus = focus.copy(color = "Yellow")

在Kotlin中,属性可以是var或val。 您可以将val视为Java中的最后一个字段(因此无法修改),而var则是一个可变属性,该属性不能为null,如果您想要一个可变的nullable属性,则需要使用“?”进行定义。 表达:

var mutable = "mutable"
val immutable = "immutable"
mutable = "changed"                    -> 'it compiles'
immutable = "changed"                  -> 'doesn't compile'
var mutableCanBeNull: String? = null   -> 'can be null'

您可以使用关键字“?”安全地访问可以为null的属性:

var mutable = "mutable"
println(mutable.legnth)                 -> 'print 7'
var mutableCanBeNull: String? = null
println(mutableCanBeNull?.length)       -> 'does not crash! print null'

在大多数情况下,在Android中,您需要等待来自框架的回调才能创建对象,这意味着在框架准备就绪之前需要将它们定义为null,然后每次使用这些对象时,都需要检查其是否不为null。

Kotlin使用var属性的lateinit关键字解决了这个问题:

lateinit var name: String     -> 'without lateinit it does not compile'
name = "Tom"
println(name.length)

请注意,您不需要做“名字?” 但是只是“名称”,因为lateinit关键字告诉编译器您将在使用属性之前先填充该属性!

现在就这样! 在下一篇文章中,我将讨论函数定义,返回类型,回调和静态字段。

from: https://dev.to//dbottillo/kotlin-by-examples-class-and-properties

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值