2.2类和属性

这一节会介绍声明类的基本语法,在以后再深入细节。
首先,来看一个简单的JavaBean类User,目前它只有一个属性name。

public class User {
    private final String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在Java中,构造方法的方法体往往包含完全重复的代码:它把参数赋值给有着相同名称的字段。在Kotlin中,这种逻辑不用这么多的样板代码就可以表达。
Android Studio中有一个代码转换器可以将Java代码转换成Kotlin,先用它来转换一下。
在Android Studio找到 Code–Convert Java File to Kotlin File,快捷键是Ctrl+Alt+Shift+K
Java文件转换成Kotlin
变成

class User {
    val name: String? = null
}

也可以简写成

class User(val name: String)

注意充Java到Kotlin的转换过程中public修饰符消失了。在Kotlin中,public是默认的可见性,所以你可以省略它。

2.2.1属性

类的概念就是把数据和处理数据的代码封装成一个单一的实体。在Java中,数据存储在字段中,通常还是私有的。如果想让类的使用者访问到数据,得提供访问器方法:一个getter,可能还有一个setter。在User类中已经看到了访问器的例子。setter还可以包含额外的逻辑,包括验证传给它的值、发送关于变化的通知等。
在Java中,字段和其访问器的组合常常被叫作属性,而许多框架严重依赖这个概念。在Kotlin中,属性是头等的语言特性,完全代替了字段和访问器方法。在类中声明一个属性和一个变量一样:使用val和var关键字。声明成val的属性是只读的,而var属性是可变的。

class User(val name: String,
           var isMarried: Boolean)

name是只读属性,会生成一个字段和一个简单的getter。isMarried是可写属性,会生成一个字段,一个getter和一个setter。
在Java中调用示例:

User user = new User();
user.getName();
user.isMarried();

在Kotlin中调用示例:

val user = User("那时年少", true)
user.name
user.isMarried

2.2.2自定义访问器

假设声明这样一个矩形,它能判断自己是否是正方形。不需要一个单独的字段来存储这个信息(是否是正方形),因为可以随时通过检查矩形的长宽是否相等来判断:

class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() {
            return height == width
        }
}

属性isSquare不需要字段来保存它的值。它只有一个自定义实现的getter,它的值是每次访问属性的时候计算出来的。
注意,不需要使用带括号的完整语法,也可以这样写 get() = height == width,对这个属性的调用方法不变:

class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() = height == width
}

val rectangle = Rectangle(25, 26)
println(rectangle.isSquare)
false       

2.2.3目录和包

Kotlin也有和Java相似的包的概念。每一个Kotlin文件都能以一条package语句开头,而文件中定义的所有声明(类、属性、函数)都会放到这个包中。如果其他文件中定义的声明也有相同的包,这个文件可以直接使用它们:如果包不相同,则需要导入它们,和Java一样,都是用import导入。
大体和Java一致,但是Kotlin可以在一个kt文件中写两个类:

package win.regin.kotlin


class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() = height == width
}

class User(val name: String, var age: Int)

不管怎样,大多数情况下,遵循Java的目录结构并根据包结构把源码文件放到目录中,依然是个不错的实践。在Kotlin和Java混用的项目中坚持这样的结构尤为重要,因为这样做可以逐步迁移代码,而不会产生一些其他问题。但是之后应该毫不犹豫地将多个类放进同一个文件中,特别是那些很小的类(在Kotlin中,类通常很小)

猜你喜欢

转载自blog.csdn.net/qq_26413249/article/details/80287810