Kotlin汇总5-内部类,枚举类,对象,代理
来源:互联网 发布:ps淘宝美工修裤子 编辑:程序博客网 时间:2024/05/21 20:06
1. 内部类
内部类是内嵌类在kotlin是不一样的,比如下面是内嵌类
class Outer { private val bar: Int = 1 class Nested { fun foo() = 2 }}val demo = Outer.Nested().foo() // == 2
下面是内部类
class Outer { private val bar: Int = 1 inner class Inner { fun foo() = bar }}val demo = Outer().Inner().foo() // == 1
还可以使用object作为内部类
window.addMouseListener(object: MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... }})
也可以使用lambda表达式
val listener = ActionListener { println("clicked") }
2. 枚举类
kotlin的枚举类和java基本一样
enum class ProtocolState { WAITING { override fun signal() = TALKING }, TALKING { override fun signal() = WAITING }; abstract fun signal(): ProtocolState}
3.对象
有些时候我们想创建一个轻微修改的类对象,但是又不想创建一个新类去继承,那么这个时候就可以用object来修饰。
window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... }})
其实说白了,object就是匿名类的意思
open class A(x: Int) { public open val y: Int = x}interface B {...}val ab: A = object : A(1), B {//可以是指定类型的 override val y = 15}fun foo() { val adHoc = object {//也可以是完全没有指定类型的。。 var x: Int = 0 var y: Int = 0 } print(adHoc.x + adHoc.y)}
需要注意:匿名对象只能用户本地声明或者private声明,看下面例子
class C { // Private function, so the return type is the anonymous object type private fun foo() = object { val x: String = "x" } // Public function, so the return type is Any fun publicFoo() = object { val x: String = "x" } fun bar() { val x1 = foo().x // Works val x2 = publicFoo().x // ERROR: Unresolved reference 'x' }}
跟java一样可以如下访问,但是不需要像java一样设置为final
fun countClicks(window: JComponent) { var clickCount = 0 var enterCount = 0 window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { clickCount++ } override fun mouseEntered(e: MouseEvent) { enterCount++ } }) // ...}
还可以作为单例模式使用
object DataProviderManager { fun registerDataProvider(provider: DataProvider) { // ... } val allDataProviders: Collection<DataProvider> get() = // ...}DataProviderManager.registerDataProvider(...)
还可以使用companion关键字修饰,变成Companion Objects
class MyClass { companion object Factory { fun create(): MyClass = MyClass() }}val instance = MyClass.create()
class MyClass { companion object { }}val x = MyClass.Companion
interface Factory<T> { fun create(): T}class MyClass { companion object : Factory<MyClass> { override fun create(): MyClass = MyClass() }}
感觉object这个东西很灵活,用起来很方便。
4. 代理
在Java中,有时候我们需要代理某个对象的方法,比如
class A{ void print(){ System.out.println(); }}class B{ A a; void print(){ a.print(); }}
但是在kotlin,只要如下写:
interface Base { fun print()}class BaseImpl(val x: Int) : Base { override fun print() { print(x) }}class Derived(b: Base) : Base by b //把b对象的方法交给Derived代理,所以代理也要慎用fun main(args: Array<String>) { val b = BaseImpl(10) Derived(b).print() // prints 10}
当然属性也是可以代理的,可以回到之前写的看看。
阅读全文
0 0
- Kotlin汇总5-内部类,枚举类,对象,代理
- Kotlin特殊类(枚举、内部类)
- Kotlin Reference (十二) 内部类、枚举
- 枚举类、内部类
- Kotlin学习笔记(七)数据类,密封类,嵌套类,内部类,枚举类
- Kotlin编程之嵌套类,内部类,匿名内部类
- kotlin--嵌套类、枚举、对象
- Kotlin嵌套类和内部类
- Kotlin-内部类
- 解析Kotlin内部类
- Kotlin类和对象 (九)--- 嵌套类与内部类
- 接口、内部类、枚举类、gc
- java 内部类 枚举
- Kotlin之匿名内部类
- Java学习系列(五)Java面向对象之抽象类、接口、内部类、枚举类详解
- Java学习系列(五)Java面向对象之抽象类、接口、内部类、枚举类详解
- Java面向对象之抽象类、接口、内部类、枚举类详解
- 内部类、匿名类【对象】
- git 使用记录
- [bigdata-086] python3+neo4j 从mysql数据库读取记录然后创建节点和关系写入到neo4j
- 一个Java笔试题
- SpringMVC参数绑定(从请求中接受参数)
- 【java设计模式】(1)单例模式
- Kotlin汇总5-内部类,枚举类,对象,代理
- GCD死锁 分析
- Java 实例
- 代理模式动态代理
- 第八届蓝桥杯国赛Java b组 第六题
- bzoj1510: [POI2006]Kra-The Disks
- 三维重建面试0:*SLAM滤波方法的串联综述
- 如何取得Windows驱动程序的数字签名
- 第五课