Kotlin Reference (十二) 内部类、枚举

KotLin 相关文档


官方在线Reference
kotlin-docs.pdf
Kotlin for android Developers 中文翻译
Kotlin开发工具集成,相关平台支持指南
Kotlin开源项目与Libraries
Kotlin开源项目、资源、书籍及课程搜索平台
Google’s sample projects written in Kotlin
Kotlin and Android

 

内部类


Kotlin中没有静态(static)关键字,如下这样声明,就是一个类似java中的静态内部类:

class Outer {
    private val bar: Int = 1 
    class Nested {
        fun foo() = 2 
    }
}
val demo = Outer.Nested().foo()

 

成员内部类 inner class


以 inner class 声明:

class Outer {
    private val bar: Int = 1 
    inner class Inner {
        fun foo() = bar 
    }
}
val demo = Outer().Inner().foo()

 

匿名内部类


以 object: 来对应java中 匿名内部类的声明

class MouseEvent
interface MouseAdapter {
    fun mouseClicked(e: MouseEvent)
    fun mouseEntered(e: MouseEvent)
}
fun addAdapter(adapter: MouseAdapter) {

}
fun load() {
    addAdapter(object : MouseAdapter {
        override fun mouseClicked(e: MouseEvent) {
            // ...
        }
        override fun mouseEntered(e: MouseEvent) {
            // ...
        }
    })
}

如果在一个java源文件中,声明一个含单个抽象方法的接口类:

public interface MyInterface {
    void doAction();
//    void doAction2();
}

这时在kotlin中,可以用kotlin中lambda表达式的调用形式:

val action = MyInterface { } //java的void,对应kotlin中的Unit

 

枚举类


枚举类是类型安全的,普通的形式如下:

enum class Direction { 
    NORTH, SOUTH, WEST, EAST
}

带属性的枚举类

如,

enum class Color(val rgb: Int) {
    RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF);
}

这样的枚举类,可以调用其中枚举对象的属性:

val colorCode = Color.RED.rgb

如果在声明构造参数时,没有val修饰:

enum class Color(rgb: Int) {
    RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF);
}

是不能,通过Color.RED.rgb 来进行调用的

含抽象方法的枚举类

enum class ProtocolState {//含抽象方法
    WAITING {
        override fun signal() = TALKING
    },
    TALKING {
        override fun signal() = WAITING
    },

    Test {
        override fun signal(): ProtocolState {
            return WAITING
        }
    };

    abstract fun signal(): ProtocolState
}

跟java中是一样的,每个枚举对象内,都要实现该抽象方法的

枚举对象的使用

fun main(args: Array<String>) {
    var direction = Direction.EAST
    direction = Direction.valueOf("NORTH")
    val ary: Array<Direction> = Direction.values()
    for (d in ary) {
        println("name=${d.name}, ordinal=${d.ordinal}")
    }

    Color.values().forEach {
        println("name=${it.name}, ordinal=${it.ordinal}, ${it.rgb}")
    }
    //kotlin1.1 新增的操作函数 enumValues<EnumClass>()  <==> EnumClass.values()
    enumValues<Color>().forEach {  }
    //kotlin1.1 新增的操作函数 enumValueOf<EnumClass>(String)  <==> EnumClass.valueOf(String)
    enumValueOf<Color>("RED")

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值