美文网首页
kotlin 类的扩展属性

kotlin 类的扩展属性

作者: Bfmall | 来源:发表于2022-11-13 12:54 被阅读0次

类的扩展属性

package com.xyaty.kotlinbasedemo.base06

import android.annotation.SuppressLint
import android.util.Log
//扩展函数重命名
import com.xyaty.kotlinbasedemo.base06.randomItemValue as random1
import com.xyaty.kotlinbasedemo.base06.showRandomItemValue as random2

/**
 * DESC   : 扩展属性
 */

const val KtBaseExtensionFieldTest01_TAG = "KtBaseExtensionFieldTest01"

//普通属性
val myStr : String = "nihaoma"
/**
 * 背后代码
 *  @NotNull
    private static final String myStr = "nihaoma";

    @NotNull
    public static final String getMyStr() {
    return myStr;
    }
 */

//扩展属性
val String.myExtStr : String
    get() = "你好吗"

/**
@NotNull
public static final String getMyExtStr(@NotNull String $this$myExtStr) {
Intrinsics.checkParameterIsNotNull($this$myExtStr, "$this$myExtStr");
return "你好吗";
}
 */

@SuppressLint("LongLogTag")
fun String.showExtFieldInfo() :String {
    Log.d(KtBaseExtensionFieldTest01_TAG, "showExtFieldInfo==>属性值是:$this")
    return this
}


//-----------------------------------------------

/**
 * 可空类型函数扩展
 */
@SuppressLint("LongLogTag")
fun String?.showExtInfo(default: String) {
    val result = this ?: default
    Log.d(KtBaseExtensionFieldTest01_TAG, "showExtInfo==>$result")
}

/**
 * 编译器非常智能,能够检测到你做了if判断(能够对你代码逻辑检测),就知道后续类型
 */
@SuppressLint("LongLogTag")
fun String?.showExtInfo2(default: String) {
    val result = if (this == null) default else this
    Log.d(KtBaseExtensionFieldTest01_TAG, "showExtInfo2==>$result")
}

//--------------------------------------------------------

/**
 * infix 中缀表达式
 * 可以简化我的代码
 */
@SuppressLint("LongLogTag")
private infix fun <C1, C2> C1.goTo(c2: C2) {
    Log.d(KtBaseExtensionFieldTest01_TAG, "中缀表达式参数一:$this, 参数二:$c2")
}

//----------------------------------------------------------


/**
 * 扩展文件:
 * 1.扩展文件一般都是public类型,如果是private,外界无法使用
 * 2.Iterable<E> 的子类 set list都可以用,所以扩展文件是父类
 * 3.本次扩展函数是随机取第一个元素返回
 *
 */
fun <E> Iterable<E>.randomItemValue() = this.shuffled().first()

@SuppressLint("LongLogTag")
fun <E> Iterable<E>.showRandomItemValue() {
    Log.d(KtBaseExtensionFieldTest01_TAG, "showRandomItemValue==>"+this.shuffled().first())
}


class KtBaseExtensionFieldTest01 {

    @SuppressLint("LongLogTag")
    fun testExtensionField01() {
        val info : String = "what are you doing ?"
        //info=你好吗
        Log.d(KtBaseExtensionFieldTest01_TAG, "info="+info.myExtStr)

        //showExtFieldInfo==>属性值是:what are you doing ?
        //showExtFieldInfo==>属性值是:what are you doing ?
        info.showExtFieldInfo().showExtFieldInfo()

        //showExtFieldInfo==>属性值是:你好吗
        //showExtFieldInfo==>属性值是:你好吗
        info.myExtStr.showExtFieldInfo().showExtFieldInfo()

        info?.showExtInfo("我很好")
        info?.showExtInfo2("我很好")

    }

    /**
     * infix 中缀表达式
     */
    fun testInfix01() {
        //map中的中缀表达式
        mapOf<String, String>("xiaowang" to "19岁")
        mapOf<String, Int>("xiaoming" to 18)

        //下面是我们自己写的中缀表达式 goTo

        /**
         * 中缀表达式参数一:xiaohong, 参数二:18
         * 中缀表达式参数一:xiaoli, 参数二:19
         * 中缀表达式参数一:xiaosan, 参数二:18
         */
        "xiaohong".goTo("18")//不使用infix可以编译通过,不是中缀表达式
        "xiaoli".goTo(19)//不使用infix可以编译通过,不是中缀表达式
        //以下的中缀表达式不加infix,编译不过,加上后就是中缀表达式
        "xiaosan" goTo 18
    }

    /**
     * 扩展文件
     */
    fun testIterable01() {
        val set : Set<String> = setOf("haha", "xixi", "gaga")

        val list : List<Double> = listOf(18.88, 38.88, 58.88)

        //Iterable的子类set,list调用父类Iterable的扩展函数


//        set.randomItemValue()
//        list.randomItemValue()

//        set.showRandomItemValue()
//        list.showRandomItemValue()


        /**
         * 扩展函数重命名
        import com.xyaty.kotlinbasedemo.base06.randomItemValue as random1
        import com.xyaty.kotlinbasedemo.base06.showRandomItemValue as random2
         */
        set.random1()
        list.random1()

        set.random2()
        list.random2()

        //重命名扩展函数
    }
}

相关文章

  • kotlin语言学习10 ——kotlin 可见性与扩展

    本节主要介绍kotlin的可见性与kotlin中的扩展功能的使用,包括:扩展类、扩展方法、扩展伴生对象、扩展属性等...

  • kotlin中扩展属性和扩展函数

    一、kotlin扩展属性扩展属性允许定义在类或者kotlin文件中,不允许定义在函数中。初始化属性因为属性没有后端...

  • kotlin 扩展属性

    与扩展方法类似,扩展属性当然也不是真正添加进了原类。 扒开糖衣看看kotlin扩展属性实现原理。 给Date类添加...

  • Kotlin-面向对象-进阶

    扩展 扩展方法 Kotlin支持扩展方法和扩展属性。语法:被扩展的类/接口名.方法名() 父类不能使用子类的扩展方...

  • Kotlin 扩展

    Kotlin 扩展Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。扩...

  • kotlin 类的扩展属性

    类的扩展属性

  • Kotlin 扩展

    原本地址:Kotlin 扩展 Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorato...

  • Kotlin扩展函数和扩展属性

    Kotlin 可以对一个类的属性和方法进行扩展,对被扩展的类代码本身不会造成任何影响。 扩展函数可以为已经存在的类...

  • kotlin基础(三)

    kotlin扩展函数 Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 装饰者模式。定义形式:f...

  • Kotlin扩展Extensions

    Kotlin支持扩展函数和扩展属性,它提供了扩展新功能类的能力,而不需要从类继承或使用任何类型的设计模式,仅仅通过...

网友评论

      本文标题:kotlin 类的扩展属性

      本文链接:https://www.haomeiwen.com/subject/jhoazrtx.html