匿名内部类
匿名内部类主要是针对那些获取抽象类或者接口对象而来的。最常见的匿名内部类点击事件:
//java,匿名内部类的写法
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
上面这个是Java
匿名内部类的写法,Kotlin
没有new
关键字,那么Kotlin
的匿名内部类该怎么写呢?
btn1.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
print("1111")
}
})
方法的参数是一个匿名内部类,先写object
,然后写你的参数类型View.OnClickListener{}
。
单例模式
object AAA{
var a = 10;
fun getName() : String{
return "武松";
}
}
上面这个类AAA
,默认就有单例,所以可以直接AAA.getName()
,这样调用方法。AAA.a
这样直接使用变量,混合模式的时候,我们的调用方式是AAA.INSTANCE.getName()
摘抄:https://www.jianshu.com/p/cdf11084c11b
单例模式在一些场景中很有用,而Kotlin
使单例声明变得很容易。
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ……
}
val allDataProviders: Collection<DataProvider>
get() = // ……
}
这称为对象声明
。并且它总是在object
关键字后跟一个名称。就像声明变量一样,对象声明不是一个表达式,不能用在赋值语句的右边。
对象声明的初始化过程是线程安全的。
如需引用该对象,直接使用其名称即可:
DataProviderManager.registerDataProvider(……)
对象声明不能用在局部作用域,但是它们可以嵌套到其他对象声明或非内部类中。
object
class Driver
interface OnExternalDriverMountListener {
fun onMount(driver: Driver);
fun onUnmount(driver: Driver);
}
abstract class Player
object MusicPlayer : Player(), OnExternalDriverMountListener {
val state: Int = 0;
fun play(url: String) {
}
fun stop() {
}
override fun onMount(driver: Driver) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onUnmount(driver: Driver) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
- 只有一个实例的类
- 不能自定义构造方法
- 可以实现接口,继承父类
- 本质上就是单例模式最基本的实现
伴生对象
- 每个类可以对应一个伴生对象
- 伴生对象的成员全局独一份
- 伴生对象的成员类似Java的静态成员
- 静态成员考虑用包级函数,变量替代
- JvmStatic和JvmField的使用
类内部的对象声明可以使用companion关键字标记:
class MyClass {
companion object Factory {
fun create():MyClass {
return MyClass();
}
}
}
该伴生对象的成员可通过只使用类名作为限定符来调用:
val instance = MyClass.create();
val instance = MyClass.Factory.create();
可以省略伴生对象的名称,在这种情况下将使用名称Companion:
class MyClass {
companion object {
...
}
}
val x = MyClass.Companion;
其自身所用的类的名称可用作对该类的伴生对象的引用:
class MyClass1 {
companion object Named {
}
}
val instance = MyClass1;
请注意,即使伴生对象的成员看起来像其他语言的静态成员,在运行时他们仍然是真实对象的实例成员,而且,例如还可以实现接口:
interface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
val f: Factory<MyClass> = MyClass
JvmStatic和JvmField的使用
class EventBusUtils {
companion object {
@JvmField
val TAG = "Kotlin";
@JvmStatic
fun register(obj: Any): Unit {
EventBus.getDefault().register(obj);
}
fun unregister(obj: Any): Unit {
EventBus.getDefault().unregister(this);
}
fun post(obj: Any): Unit {
EventBus.getDefault().post(obj);
}
}
}
网友评论