kotlin 属性优雅的声明定义

kotlin属性定义和声明是要求必须做好初始化

基本数据类型

开始初始化的时候给属性赋值个默认值

private var currentPage = 0
private var isCanFished = false

或者通过使用 Delegates.notNull()

private var currentPage by Delegates.notNull<Int>()
private var isCanFished by Delegates.notNull<Int>()
    

引用类型

var修饰 可以使用lateinit

 private lateinit var name: String

或者使用Delegates.notNull()

private var name  by Delegates.notNull<String>()

val 修饰的 使用Delegates.notNull()

 private val name  by Delegates.notNull<String>()
 

或者使用lazy

lazy()

lazy()是接受一个 lambda 并返回一个 Lazy 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lambda 表达式并记录结果, 后续调用 get() 只是返回记录的结果

常见场景是,只获取,不赋值,并且多次使用的对象

    private val homeArticleAdapter by lazy { HomeArticleAdapter() }

自定义属性代理实现属性委托 支持基本类型和引用类型

class Preference<T>(private val context: Context,private val name: String, private val default: T): ReadWriteProperty<Any?, T>{
    
    companion object{
         const val IS_LOGIN = "is_login"
    }
    
    private val prefs: SharedPreferences by lazy{
        PreferenceManager.getDefaultSharedPreferences(context)
    }
    
    override fun getValue(thisRef: Any?, property: KProperty<*>): T{
        return getValue(name, default)
    }
    
    override fun setValue(thisRef: Any?,property: KProperty<*>,value: T){
        putValue(name,value)
    }
    
    
    private fun<T> putValue(name: String, value: T) = with(prefers.edit()) {
        when(value){
            is Long  -> putLong(name,value)
            is String -> putString(name,value)
            is Boolean -> putBoolean(name,value)
            is Int  -> putInt(name,value)
            is Float -> putFloat(name,value)
            else ->putString(name, serialize(value))
        }
    } 
    
    private fun<T> getValue(name: String, default: T): T = with(prefers){
        val res: Any = when(default){
            is Long -> getLong(name,default)
            is String -> getString(name,default)
            is Boolean -> getBoolean(name, default)
            is Int -> getInt(name,default)
            is Float -> getFloat(name,default)
            else -> deSerialization(getString(name,serialize(defalut)))
            
        }
        return res as T
    }
    
     @Throws(IOException::class)
    private fun <A> serialize(obj: A): String {
        val byteArrayOutputStream = ByteArrayOutputStream()
        val objectOutputStream = ObjectOutputStream(
                byteArrayOutputStream)
        objectOutputStream.writeObject(obj)
        var serStr = byteArrayOutputStream.toString("ISO-8859-1")
        serStr = java.net.URLEncoder.encode(serStr, "UTF-8")
        objectOutputStream.close()
        byteArrayOutputStream.close()
        return serStr
    }
    
    @Suppress("UNCHECKED_CAST")
    @Throws(IOException::class, ClassNotFoundException::class)
    private fun <A> deSerialization(str: String): A {
        val redStr = java.net.URLDecoder.decode(str, "UTF-8")
        val byteArrayInputStream = ByteArrayInputStream(
                redStr.toByteArray(charset("ISO-8859-1")))
        val objectInputStream = ObjectInputStream(
                byteArrayInputStream)
        val obj = objectInputStream.readObject() as A
        objectInputStream.close()
        byteArrayInputStream.close()
        return obj
    }
    
    
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值